1.数组

var arr1 [5]int // 声明数组
arr2 := [3]int{1, 3, 5}  // 声明数组并赋值
arr3 := [...]int{2, 4, 6, 8, 10} // 不输入数组长度,让编译器来计算长度
var grid [4][5]int // 二维数组
  • 数量写在类型前
  • 可通过 _ 来省略变量,不仅仅是 range,任何地方都可通过 _ 来省略变量
sum := 0
for _, v := range numbers {
    sum += v
}
  • 如果只要下标 i,可写成for i := range numbers
  • 为人么要用 range? 因为意义明确、美观,c++:没有类似能力,Java/Python:只能 for each value,不能同时获取 i, v
  • 数组是值类型
  • [10]int[20]int 是不同类型
  • 调用 func f(arr [10]int)拷贝 数组
  • 在 go 语言中一般不直接使用数组(指针),使用切片

2.切片

arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s := arr[2:6]

s 就是一个切片,值为[2 3 4 5]

  • Slice本身没有数据,是对底层 array 的一个 view
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s := arr[2:6]
s[0] = 10

arr 的值变为 [0 1 10 3 4 5 6 7]

  • Reslice
s := arr[2:6]
s = s[:3]
s = s[1:]
s = arr[:]
  • Slice 的扩展
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
s2 := s1[3:5]

s1的值为?s2的值为? s1的值为[2 3 4 5],s2的值为[5 6]

  • slice 可以向后扩展,不可以向前扩展 s[i]不可以超越 len(s),向后扩展不可以超越底层数组 cap(s) 向 Slice 添加元素
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
s2 := s1[3:5]
s3 := append(s2, 10)
s4 := append(s3, 11)
s5 := append(s4, 12)

s3, s4, s5的值为?arr 的值为? 添加元素时如果超越 cap,系统会重新分配更大的底层数组.由于值传递的关系,必须接收 append 的返回值

s = append(s, val)

3.map

map的内部实现是hash table, 声明方式:map[KeyType]ValueType。除slice, map, function外的内建类型都可以作为key, 如果key使用了Struct 类型, 那么Struct 类型中如果不包含上述字段,也可作为key

key 不存在时,获得Value 类型的初始值(Zero value),可以使用 value, ok := m[key]来判断是否存在 key,使用 delete 删除一个 key

// 定义一个map
m := map[string] string {
	"name": "ccmouse",
	"course": "golang",
	"site": "imooc",
	"quality": "notbad",
}

m2 := map[string]map[int]string  //map可以作为map的value

var m3 map[int]string        //声明一个map, nil
m3[1] = "123"                //错误,因为此时m3是nil

m4 := make(map[string] int)  //声明一个map, empty map

for k, v := range m {
	fmt.Println(k, v)
}

map 的遍历和slice一样,使用 range 遍历 key,或者遍历 key, value 对, 注意遍历map不能保证遍历的顺序(hash table),如需顺序,需手动对 key 排序。使用 len() 获取元素个数

4.字符串

  • rune相当于 go 语言的 char
  • 使用 range 遍历 pos, rune
  • 使用 utf8.RuneCountInString 获得字符数量
  • 使用 len 获得字节长度
  • 使用[]byte 获得字节
  • 其它字符串操作 Fields, Split, Join Contains, Index ToLower, ToUpper Trim, TrimRight, TrimLeft