黄宽的blog

宁可十年不将军,不可一日不拱卒



数组与切片

a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //初始化一个数组
    b := a[5:10]                                //从a切片
    fmt.Println(a)
    fmt.Println(b)
    c := make([]int, 1, 10)        //第一个参数为类型,切片。第二参数为默认元素个数。第三个参数为最大容量,可以不设置默认为默认元素个数
    d := a[7:8]                    //从a中切片
    fmt.Println(d, len(d), cap(d)) //*l-1
    fmt.Println(len(c), cap(c), reflect.TypeOf(c))
    fmt.Println("在这里换行,下面做append和切片重新分配容量实验*l-2")
    fmt.Printf("%p\n", c)
    fmt.Println(len(c), cap(c))
    c = append(c, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    fmt.Printf("%p\n", c)
    fmt.Println(len(c), cap(c))
    c = append(c, 10)
    fmt.Printf("%p\n", c)
    fmt.Println(len(c), cap(c))
    fmt.Println("在这里换行,下面做切片为底层数组实验*l-3")
    e := []int{10, 20, 30, 40, 50, 60}
    se1 := e[2:6]
    se2 := e[1:3]
    fmt.Println(se1)
    fmt.Println(se2) //在这里se1与se2都拥有30这个值,那么如果更改30这个值,e,se1,se2会有什么变化?
    se1[0] = 300
    fmt.Println(e, se1, se2)
    fmt.Println("在这里换行,下面做切片为底层数组实验*l-4")
    e1 := []int{10, 20, 30, 40, 50, 60}
    se3 := e1[2:6]
    se4 := e1[1:3]
    se4 = append(se4, 1, 2, 3, 4)
    se3[0] = 100
    fmt.Println(e1, se3, se4) //在这里可以看到更改se3的值,并没有影响到se4
    fmt.Println("在这里换行,下面做copy实验*l-5")
    f := []int{1, 2, 3}
    g := []int{4, 5, 6, 7, 8}
    copy(f, g)
    fmt.Println(f) //在这里可以看到f变成三个元素了
//切片
//b等于a的第四个元素到最后一个元素。这是取数组的一部分出来,也可以写作a[5:],a[5:len(a)]
//取前五个元素[:5]。具体可以看做后一个数减去前一个数等于取出个数,前一个数为索引开始
//切片可作为一个变长数组来看,分配了最大容量,当实际元素大于最大容量时,最大容量会翻倍,也就是重新分配内存地址,并重新拷贝数据
//重新分配内存地址是较为占用资源的
//*l-1,reslice从切片中再切片,可以看到d虽然只有一个元素,但是容量却是2,从切片中获取的切片
//*l-2,d的最小索引为7,7取出来的数是8,最大容量应该从a的索引7到9,也就是7,8,9三个索引,最大容量应该为3
//如果d:[:5],那么会取出a的从0到4的元素作为d切片,而d的最小索引为0,最大容量应该从a的索引0到9,总共10
//有学到printf的一个用法了printf("%p",变量)打印变量的内存地址,"%v"为值,双引号内可以加换行符\n
//c可以看到,第一次添加9个元素到c里面,内存地址是一样的,现在c已经是10个元素等于最大容量,如果再添加一个元素,容量就会变成20,同时内存地址也发生了改变
//*l-3,在这里可以看到,更改一个切片中的值,会将原始数组的值和其他切片有同样键的值都改变,意味着slice是指向的底层的一个数组,可以简单的理解为引用赋值
//*1-4,当一个切片的容量发生改变并随着append扩大时,se4的内存地址发生了改变,所以se3的改变只会影响到e1并没有影响到se4
//*1-5,当发生copy行为时,会以长度最短的数组为准,copy的两个参数也可以只截取f的一部分和g的一部分发生copy,比如f[0:1],g[4:5],最后打印出来的结果就为823
//在这里数组的个数不能明确的声明,比如f的中括号内不能有指定长度或者...g数组同理,copy只适用于切片,所以可以得出如果申明了长度的类型则为数组,未声明长度的类型则为切片

最后打印出来的结果:

[1 2 3 4 5 6 7 8 9 10]

[6 7 8 9 10]

[8] 1 3

1 10 []int

在这里换行,下面做append和切片重新分配容量实验*l-2

0xc04207e0a0

1 10

0xc04207e0a0

10 10

0xc042086000

11 20

在这里换行,下面做切片为底层数组实验*l-3

[30 40 50 60]

[20 30]

[10 20 300 40 50 60] [300 40 50 60] [20 300]

在这里换行,下面做切片为底层数组实验*l-4

[10 20 100 40 50 60] [100 40 50 60] [20 30 1 2 3 4]

在这里换行,下面做copy实验*l-5

[4 5 6]


  golang

作者  :  黄宽

不耻最后,即使慢,驰而不息,纵会落后,纵令失败



About ME

about me

黄宽

我不想成为一个庸俗的人。十年百年后,当我们死去,质疑我们的人同样死去,后人看到的是裹足不前、原地打转的你,还是一直奔跑、走到远方的我?

友情链接