数组/切片定义
// s 是一个slice切片s := []string{"a","b","c","d"}// aa 是一个数组字面值a := [...]string{"a","b","c","d","e"}for k, v := range a {fmt.Println(k, v)}
上面的例子中,s是一个切片slice,而a是一个数组,
a的定义为:[5]string,有5个元素的字符串数组,不能再改变,比如:a = []string{“f”,”g”}是不对的
s是切片,是不定长的,可以继续赋值:s = []string{“1”,”2”,”3”},就变成3个元素。
所以,动态的数组是用slice实现的。
我常用到是类似JavaScript或者Python中的动态数组,动态的list,不知道长度,可以append的那种
// 定义一个动态的var tmpStr []string// 或者直接初始化tmpStr := []string{}for k,v := range SomeListOrArray{tmpStr = append(tmpStr,v)}
make函数生成
make([]T, len)make([]T, len, cap) // same as make([]T, cap)[:len]
在底层,make创建了一个匿名的数组变量,然后返回一个slice;只有通过返回的slice才能引用底层匿名的数组变量。在第一种语句中,slice是整个数组的view。在第二个语句中,slice只引用了底层数组的前len个元素,但是容量将包含整个的数组。额外的元素是留给未来的增长用的。
append函数向slice追加元素
var runes []runefor _, r := range "Hello, 世界" {runes = append(runes, r)}fmt.Printf("%q\n", runes) // "['H' 'e' 'l' 'l' 'o' ',' ' ' '世' '界']"
其中 rune是int32类型的别名,就相当于byte是int8
- byte 等同于int8,常用来处理ascii字符
- rune 等同于int32,常用来处理unicode或utf-8字符,用来处理中英文混合的字符串
