指针

  • Go语言中只有值传递。
  • 切片、映射、通道、函数等引用类型也是值传递,只不过它们的值是指针,所以对形参的改变也会反映到实参本身。
  • 指针是指保存了另一个变量内存地址的变量。通过指针可以让参数传递的成本最低且内容可修改,而且可以让变量的生命周期独立于作用域。

数组和切片

  • 使用如下语法创建数组。
    1
    2
    3
    [length]Type
    [N]Type{value1, value2, ..., valueN}
    [...]Type{value1, value2, ..., valueN}
  • 数组的长度是固定的,不可以修改。
  • 数组的容量cap()和长度len()都等于数组的长度。
  • 数组按值传递,及传递给函数的是数组的副本,而切片是引用类型,传递的是指针。
1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func changeArray(a [3]int) {
a[0] = 3
}

func main() {
myarray := [3]int{1, 2, 3}
changeArray(myarray)
fmt.Println(myarray) // 因为myarray是数组,所以打印结果为 [1 2 3]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func changeArray(a []int) {
a[0] = 3
}

func main() {
myarray := []int{1, 2, 3}
changeArray(myarray)
fmt.Println(myarray) // 因为myarray是切片,所以打印结果为 [3 2 3]
}
  • 可以使用下面的方法创建切片。
    1
    2
    3
    4
    make([]Type, length, capacity)
    make([]Type, length)
    []Type
    []Type(value1, value2, ..., valueN)
  • 多个切片如果共享一个底层数组,那么对其中一个切片数值的改变,也会影响其他切片。
  • 可以使用for index, item := range s {}来遍历切片s。
  • 可以使用s = append(s, "a", "b", "c")或者s = append(s, t...)来将元素a, b, c和切片t追加到切片s中。
  • 可以使用nr = copy(s, t)将t切片中的内容拷贝到s中。
  • 可以使用标准库中的sort包来对排序和搜索切片。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package main

    import (
    "fmt"
    "sort"
    )

    func main() {
    myarray := []int{1, 3, 2}
    files := []string{"Test.conf", "utils.go", "Makefile"}
    target := "Makefile"
    fmt.Println(sort.IntsAreSorted(myarray)) // false
    sort.Ints(myarray)
    fmt.Println(myarray) //[1 2 3]

    sort.Strings(files)
    fmt.Printf("%q\n", files) // ["Makefile" "Test.conf" "utils.go"]
    i := sort.Search(len(files),
    func(i int) bool { return files[i] >= target })
    if i < len(files) && files[i] == target {
    fmt.Printf("found \"%s\" at files[%d]\n", target, i) // found "Makefile" at files[0]
    }
    }

映射

  • 创建映射的方式
    • make(map[KeyType]ValueType, initialCapacity)
    • make(map[KeyType]ValueType
    • map[KeyType]ValueType{}
    • map[KeyType]ValueType{key1: value1, ..., keyN: valueN}
  • 映射的操作
    • m[k] = v: 赋值v给映射的键值k
    • delete(m, k): 删除map中的k
    • v := m[k]: 将map中k对应的值赋值给v
    • v, found := m[k]: 如果k值不存在,将v赋值为0,found设为false
    • len(m): 返回map中的键值对数目