可变参数函数
- 函数的最后一个参数被记作
...T
,这时函数可以接受任意个T
类型参数作为最后一个参数。注意:只有函数的最后一个参数才允许是可变的。 - 可变参数函数的工作原理是把可变参数转换为一个新的切片。
- 不给可变参数传入任何参数,这也是合法的,在这种情况下是一个长度和容量为0的nil切片。
- Go有一个语法糖,在切片后加上
...
后缀,可以直接将切片传入可变参数函数。注意:如果这样做,切片将直接传入函数,不再创建新的切片。
Map
- 创建map:
- 方式1:
make(map[type of key]type of value)
,e.g.make(map[string]int)
; - 方式2:声明的同时初始化map,e.g.
- 方式1:
salary := map[string]int{
"steve": 12000,
"john": 15000,
}
- map的零值是
nil
,如果添加元素到nil map中,会触发运行时panic,所以map使用前必须初始化。 - 所有可比较的类型,如boolean、integer、float、complex、string等,都可以作为map的键。
- map中获取一个不存在的元素,会返回该元素类型的零值。
- 判断map中是否存在某个key语法:
value, ok := map[key]
,ok为true,表示key存在,对应的值即value,反之key不存在。 - 遍历map中所有的元素用
for range
循环,需要注意的是,使用for range
遍历map时,不保证每次执行程序获取的元素顺序相同。 - 删除map中key的语法:
delete(map, key)
,这个函数没有返回值。 - 获取map的长度使用len函数。
- 和slice类似,map也是引用类型,当map被赋值给一个新变量的时候,它们指向同一个内部数据结构。
- map之间不能使用
==
操作符判断,==
只能用来检查map是否为nil。所以判断两个map是否相等的方法是遍历比较两个map中的每个元素。
字符串
- Go语言中的字符串是一个字节切片。
- Go语言中的字符串是兼容Unicode编码的,并且使用UTF-8进行编码。
- rune是Go语言的内建类型,它也是int32的别称。在Go语言中,rune表示一个代码点。代码点无论占用多少个字节,都可以用一个rune来表示。简单地说,rune代表一个字符,所以可以通过将string类型强制转换为rune slice来进行字符的遍历输出。
- Go提供了一种更简单的方法来遍历字符串中的字符,e.g.
func main() {
s := "你好世界!Hello"
for i, r := range s {
fmt.Printf("[%d-%c]", i, r)
}
// Output: [0-你][3-好][6-世][9-界][12-!][15-H][16-e][17-l][18-l][19-o]
}
- 注意以下两种遍历方法之间的区别:虽然
ch
的输出相同,但它们输出的索引值是不同的,[]rune(s)
底层重新分配了数组,作为rune类型的slice,它的索引值是连续加1的。看实际需求选择正确的方法。
func main() {
s := "Hello你好世界!"
for i, ch := range s {
fmt.Printf("[%d %c] ", i, ch)
}
fmt.Println()
// [0 H] [1 e] [2 l] [3 l] [4 o] [5 你] [8 好] [11 世] [14 界] [17 !]
for i, ch := range []rune(s) {
fmt.Printf("[%d %c] ", i, ch)
}
fmt.Println()
// [0 H] [1 e] [2 l] [3 l] [4 o] [5 你] [6 好] [7 世] [8 界] [9 !]
}
- utf8 package中的
func RuneCountInString(s string) (n int)
方法用来获取字符串的长度。这个方法传入一个字符串参数然后返回字符串中的rune数量。 - Go中的字符串是不可变的,一旦一个字符串被创建,那么它将无法被修改。为了修改字符串,可以把字符串转化为一个rune slice,然后这个slice可以进行任何想要的改变,然后再转化为一个字符串。
指针
- 指针是一种存储变量内存地址的变量。
- 指针变量的类型为
*T
,该指针指向一个T类型的变量。 - 指针的零值是
nil
。 - 指针的解引用可以获取指针所指向的变量的值。将
a
解引用的语法是*a
。 - 不要向函数传递数组的指针,而应该使用切片。
- Go语言中不支持指针运算。
reference:
https://studygolang.com/articles/12173
https://studygolang.com/articles/12251
https://studygolang.com/articles/12261
https://studygolang.com/articles/12262