如果你还分不清切片和数组的区别,就仔细阅读下这篇文章吧,我尽力给你讲清楚。
第一个坑点,就是很多人会把切片混入到 Go 的基础类型里面,这是一个最大的坑。
那切片到底是什么呢?
这可能是创始人,某一时刻脑袋一发光,发现让开发者直接操作数组,总是容易出错。
于是就帮我们写了一个功能扩展,取了一个名字就叫切片。
所以切片只是一个功能扩展,是一个结构体。
首先我们先来看下数组是怎么定义的:
var a [3]string
a[0] = "w"
a[1] = "h"
a[2] = "d"
fmt.Println(a)
fmt.Printf("%T",a)
这段代码如果执行,结果是这样的:
[w h d]
[3]string
数字在声明时是一定需要指定长度的,如果是任意长度的数组,也得是在方括号里面用三个点 ... 来声明,比如这样:
a := [...]int{1, 2, 3} // ... 会自动计算数组长度
fmt.Println(a)
fmt.Printf("%T",a)
他会自动计算长度,你打印类型时得到的是这样的:
[1 2 3]
[3]int
如果你一不小心忘记前面加长度了,那它就变成切片了,比如这样:
a := []int{1, 2, 3}
fmt.Println(a)
fmt.Printf("%T",a)
打印出来的结果也变成没长度的了:
[1 2 3]
[]int
或者你截取一个长度,它也瞬间变切片:
a := [3]string{"h","e","o"}
b := a[1:2]
fmt.Println(b)
fmt.Printf("%T",b)
其实也不是变,而是内部偷偷的帮我们做了转化!
细心的同学会发现,不同长度的数组打印出来的类型是不一样的。
所以不同长度的数组是不能互相赋值的:
a := [3]int{1, 2, 3}
b := [4]int{2, 3, 4, 5}
a = b //这是错误的
数组的传递属于值传递,每次传递都会被复制。
来看下代码:
a := [3]int{1, 2, 3}
b := a
a[0] = 100
此时如果我们打印 a b 的值是否会一样呢?
答案是不一样的,修改 a 的值并不会影响到 b,因为他们是值传递,也就是复制了一份到b。
再来看一段代码:
func main{
a := [2]int{1,2}
sum(a)
fmt.Println(a)
}
func sum(arr [2]int) {
arr[0] = 200
}
此时运行输出的结果会是什么呢?
没错,还是 [1, 2]
,值并不会被改变。
因为在传递到 sum 方法时是采用值复制的方式传递的。
所以一般在传递数组或者切片时,我们为了节省性能一般都传递指针。
最后,再次强调,Go 的基础数据类型里面是没有切片的,理解了么?
你学废了么?
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有