Go学习笔记03-可变参数函数|map|字符串|指针

可变参数函数

  • 函数的最后一个参数被记作...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.
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