go学习--切片

来源:互联网 发布:在淘宝买东西省钱的app 编辑:程序博客网 时间:2024/05/16 02:49

切片的类型是 []T,T 是切片元素的类型。和数组不同的是,切片没有固定的长度。属于变长数组
切片的字面值和数组字面值很像,不过切片没有指定元素个数:
letters := []string{"a", "b", "c", "d"}
切片可以内置函数 make 创建,函数签名为:func make([]T, len, cap) []T
T 代表被创建的切片元素的类型。函数 make 接受一个类型、一个长度和一个可选的容量参数。
var s []byte
s = make([]byte, 5, 5)
当容量参数被忽略时,它默认为指定的长度。下面是简洁的写法:
s := make([]byte, 5)
可以使用内置函数 len 和 cap 获取切片的长度和容量信息。
b := []byte{'g', 'o', 'l', 'a', 'n', 'g'}
a := b[m:n]        //b[m]到b[n-1]中的元素赋值给新的切片
要增加切片的容量必须创建一个新的、更大容量的切片,然后将原有切片的内容复制到新的切片。
append增加切片元素时,如果超出原有切片长度,则会重新申请一个新的切片,然后放入新增元素,
之后将新切片命名为原来的切片名
如果多个切片同时指向同一个数组,一个切片改变数组的值,则所有相关的切片的值都会被改变


eg:
func main() {
    a := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    s1 := a[:6]                       //[0 1 2 3 4 5]
    s2 := a[5:]                       //[5 6 7 8 9]
    fmt.Println(s1, len(s1), cap(s1)) //6 10
    fmt.Println(s2, len(s2), cap(s2)) //5 5
    s3 := s1[3:7]                     //
    fmt.Println(s3, len(s3), cap(s3)) //[3 4 5 6] 4 7
    s4 := make([]int, 3, 6)
    s4 = append(s4, 1, 2, 3)
    fmt.Println(s4, len(s4), cap(s4)) //[0 0 0 1 2 3] 6 6
    s1[5] = 10                        //会改变原数组
    fmt.Println(a)
    fmt.Println(s1, len(s1), cap(s1)) //[0 1 2 3 4 10] 6 10
    fmt.Println(s2, len(s2), cap(s2)) //[10 6 7 8 9] 5 5
}


0 0