美文网首页
数组与切片 golang

数组与切片 golang

作者: 与子笑 | 来源:发表于2020-09-03 19:22 被阅读0次
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
0xc04207e0a01
100xc04207e0a010
100xc04208600011
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

相关文章

  • Golang数组与切片

    Golang数组与切片 数组的声明 Golang中的数组属于静态数组,不允许动态扩展 Golang中数组会默认初始...

  • 数组与切片-GOLANG

    golang -@amazeUI -2017-08-02 14:19:14 a := [10]int{1, 2, ...

  • golang 数组与切片

    1. 切片与数组对比 (1). 列表数组是具有固定长度且拥有零个或者多个相同数据类型元素的序列。数组的长度是数组类...

  • 数组与切片 golang

    b 等于 a 的第四个元素到最后一个元素。这是取数组的一部分出来,也可以写作 a[5:],a[5:len(a)],...

  • 一篇文章理解 golang 中切片与数组的关系

    起始 在 golang 文档中,对数组与切片有一些详细的讲解,本文主要讲解数组与切片的关系 由于是个人理解,可能有...

  • Golang:数组与切片的复制

    在Golang中,数组是值类型而切片是引用类型。因此值的复制与切片的复制并不相同。 数组的复制 对于值类型的数组来...

  • 简记python的tuple和slice

    python也有类似于golang中数组和切片的概念。python中的数组为tuple(固定的),切片为list(...

  • Golang 数组 切片

    Golang 数组和切片 go提供了相应数据类型来存储多个相同类型的元素。它们分别是数组和slice切片。其中,切...

  • Golang 中的数组 (array) 和切片 (slice)

    huangwenwei - 字里行间 | Golang 中的数组 (array) 和切片 (slice) 中文描述...

  • Golang数组和切片的区别

    Golang数组和切片的区别 大纲 数组是固定大小 切片不是动态数组,可以扩容 区别 定义方式不一样 初始化方法不...

网友评论

      本文标题:数组与切片 golang

      本文链接:https://www.haomeiwen.com/subject/ghzsjktx.html