golang slice 学习笔记
1. 函数调用时传递的参数为拷贝的副本, 在函数内部改变参数的值不会影响原变量。但是 golang 中 slice、map、channel、pointer、function 是引用类型,赋值时拷贝的是指针值,对这些变量作出修改时会影响原变量的值。2. array(数组)与 slice(切片) 的区别 1. array 1. 长度固定。在声明时需要指定长度和初值。作为函数参数时,必须指定数组的大小,且传入的数组长度必须与声明的长度一致。 2. 值传递。 2. slice 1. 动态长度。 2. 引用传递。但作为参数传递到函数中时,若在函数中对 slice 进行扩容(或缩容?)时不会修改外部的 slice 。 3. slice 声明方式 1. var s []T(只声明,不进行初始化)
2. make([]int, len, cap(optional))
3. 字面量声明
var s []int fmt.Println(s == nil) // true fmt.Println(s) // [] marshal, err := json.Marshal(s) fmt.Println(string(marshal), err) // null, 反序列化时为nil
s := make([]int, 2, 5) fmt.Println(s) // [0 0] fmt.Println(len(s))// 2 fmt.Println(cap(s))// 5
s := []int{} fmt.Println(s) // [] fmt.Println(len(s)) // 0 fmt.Println(cap(s)) // 0 jsonBytes, _ := json.Marshal(s) fmt.Println(string(jsonBytes)) // [] s = []int{1, 2, 3} fmt.Println(s) // [1 2 3] fmt.Println(len(s)) // 3 fmt.Println(cap(s)) // 3