数组
数组是值类型
- [10]int 和 [20]int 是不同类型
- 调用func f(arr [10]int) 会拷贝数组
- 在go语言中一般不直接使用数组
package main
import "fmt"
func printArray(arr [5]int) {
for i, v := range arr {
fmt.Println(i, v)
}
}
func main() {
var arr1 [5]int
arr2 := [3]int {1, 3, 5}
arr3 := [...]int{2, 4, 6, 8, 10}
var grid [4][5]int //多维数组
fmt.Println(arr1,arr2,arr3)
fmt.Println(grid)
for i := 0; i < len(arr3); i++ {
fmt.Println(arr3[i])
}
printArray(arr1)
printArray(arr3)
}
切片 Slice
Slice 是一个视图
- Slice本身没有数据,是对底层array的一个view(视图)
- 添加元素时如果超越cap, 系统会重新分配更大de底层数组
- 由于值传递的关系,必须接收append的返回值
package main
import "fmt"
func updateSlice(s []int) {
s[0] = 100
}
func main() {
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:]
s2 := arr[:]
fmt.Println("arr[2:6] = ", arr[2:6])
fmt.Println("arr[:6] = ", arr[:6])
fmt.Println("arr[2:] = ", s1)
fmt.Println("arr[:] = ", s2)
updateSlice(s1)
updateSlice(s2)
fmt.Println(s1)
fmt.Println(s2)
s2 = s2[:3]
fmt.Println(s2)
s1 = arr[2:6]
s2 = s1[3:5]
fmt.Println("s1 = ",s1)
fmt.Println("s2 = ",s2)
fmt.Println("s1=%v, len(s1)=%d, cap(s1)=%d\n",
s1, len(s1), cap(s1))
fmt.Println("s2=%v, len(s2)=%d, cap(s2)=%d\n",
s2, len(s2), cap(s2))
fmt.Println(s1[3:6])
s3 := append(s2, 10)
s4 := append(s3, 11)
s5 := append(s4, 12)
fmt.Println(s3, s4, s5)
fmt.Println(arr)
}
Map
map的操作
- 创建:make(map[string]int)
- 获取元素: m[key]
- key不存在时,获得value的初始值
- 用value, ok := m[key] 判断key是否存在
- 用delete删除一个key
map的遍历 - 使用range遍历key,value 键值对
- 不保证遍历顺序,如需顺序,需手动对key排序
- 使用len获取元素个数
map的key - map使用哈希表,必须可以比较相等
- 除了slice,map,function的内建类型都可以作为key
- Struct类型不包含上述字段,也可作为key
package main
import "fmt"
func main() {
m := map[string]string {
"name": "ccmouse",
"course": "golang",
"site": "imooc",
"quality": "notbad",
}
m2 := make(map[string]int) //empty map
var m3 map[string]int // nil
fmt.Println(m, m2, m3)
for _,v := range m {
fmt.Println( v)
}
fmt.Println(m["name"])
name, ok := m["name"]
delete(m, "name")
fmt.Println(name,ok)
}