Go语言学习(六)---Slice

slice(切片)类型,是Go语言中的一种引用类型,如果你将一个切片赋值给另外一个切片,这两个切片将引用同一个底层数组。这与传递一个指向底层数组的指针相类似。

确切地说,slice就是一个指向array的指针。

 

slice的创建:

    //通过make直接创建
    s1 := make([]int, 10)
    fmt.Println(s1) //[0 0 0 0 0 0 0 0 0 0]

    
    // 这不是创建数组哦~~创建数组是[n]<type>或者[...]<type>
    s2 := []int{1, 2, 3, 4, 5}
    fmt.Println(s2) //[1 2 3 4 5]

   

通过上述2中方式都可以直接创建slice。(引用类型一般都通过make来创建)

 

不过,如果给定一个array 或者其他slice,一个新slice 通过a[I:J] 的方式创建。

这会创建一个新的slice,指向a,从序号I 开始,结束在序号J之前。长度为J - I。即[I,J)

例如:

a := [...]int{1, 2, 3, 4, 5}
fmt.Println(a) //[1 2 3 4 5]

s1 := a[2:4] //[3 4]
fmt.Println(s1)

//s1[0] = 99 //3--->99
//fmt.Println(s1)
//fmt.Println(a)

s2 := a[1:5] //[2 3 4 5]
fmt.Println(s2)

//这是a[0:len(a)]的简化写法
s3 := a[:] //[1 2 3 4 5]
fmt.Println(s3)

//这是a[0:4]的简化写法
s4 := a[:4] //[1 2 3 4]
fmt.Println(s4)

s5 := s2[:] //[2 3 4 5]
fmt.Println(s5)

上面的代码中,创建的s1~s5都指向数组a,所以,通过s1~s5更改任意一个值,都会反映到数组a中。

也就是说,s1[0] = 99之后,s1~s5已经数组a里面的3都变成了99。

 

slice的扩展:

append:函数append 向slice s 追加零值或其他x 值,并且返回追加后的新的、与s 有相同类型的slice。

package main

import "fmt"

func main() {
    s0 := make([]int, 10)

    for i := 0; i < 10; i++ {
        s0[i] = i
    }
    fmt.Println(s0)

    s1 := append(s0, 2) //追加一个元素
    fmt.Println(s1)

    s2 := append(s1, 3, 5, 7)  //追加多个元素
    fmt.Println(s2)

    s3 := append(s2, s0...) //追加一个slice,注意这三个点!!
    fmt.Println(s3)
}

Copy:函数copy 从源slice src 复制元素到目标dst,并且返回复制的元素的个数。

    var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7}
    var s = make([]int, 6)
    n1 := copy(s, a[0:]) //将a(从0开始)拷贝到s中,s长度只有6,所以拷贝[0 1 2 3 4 5]
    fmt.Println(n1)      //6
    fmt.Println(s)       //[0 1 2 3 4 5]
    
    n2 := copy(s, s[2:]) //将s(从2开始)拷贝到s中,只拷贝了[2 3 4 5]四个数,覆盖了s的前四个数
    fmt.Println(n2)      //4
    fmt.Println(s)       //[2 3 4 5 4 5]

 

 

 

 

posted @ 2013-03-26 23:02  yejg1212  阅读(375)  评论(0编辑  收藏  举报