前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 基础数据类型里,只有数组没有切片

Go 基础数据类型里,只有数组没有切片

作者头像
小锟哥哥
发布2022-05-10 09:14:24
3030
发布2022-05-10 09:14:24
举报
文章被收录于专栏:GoLang全栈

如果你还分不清切片和数组的区别,就仔细阅读下这篇文章吧,我尽力给你讲清楚。

一、Go 里面基础类型只有数组

第一个坑点,就是很多人会把切片混入到 Go 的基础类型里面,这是一个最大的坑。

那切片到底是什么呢?

这可能是创始人,某一时刻脑袋一发光,发现让开发者直接操作数组,总是容易出错。

于是就帮我们写了一个功能扩展,取了一个名字就叫切片。

所以切片只是一个功能扩展,是一个结构体。

二、数组稍不注意就变切片了

首先我们先来看下数组是怎么定义的:

代码语言:javascript
复制
var a [3]string
a[0] = "w"
a[1] = "h"
a[2] = "d"
fmt.Println(a)
fmt.Printf("%T",a)

这段代码如果执行,结果是这样的:

代码语言:javascript
复制
[w h d]
[3]string

数字在声明时是一定需要指定长度的,如果是任意长度的数组,也得是在方括号里面用三个点 ... 来声明,比如这样:

代码语言:javascript
复制
a := [...]int{1, 2, 3} // ... 会自动计算数组长度
fmt.Println(a)
fmt.Printf("%T",a)

他会自动计算长度,你打印类型时得到的是这样的:

代码语言:javascript
复制
[1 2 3]
[3]int

一不小心变切片:

如果你一不小心忘记前面加长度了,那它就变成切片了,比如这样:

代码语言:javascript
复制
a := []int{1, 2, 3}
fmt.Println(a)
fmt.Printf("%T",a)

打印出来的结果也变成没长度的了:

代码语言:javascript
复制
[1 2 3]
[]int

或者你截取一个长度,它也瞬间变切片:

代码语言:javascript
复制
a := [3]string{"h","e","o"}
b := a[1:2]
fmt.Println(b)
fmt.Printf("%T",b)

其实也不是变,而是内部偷偷的帮我们做了转化!

三、典型坑

1、长度坑

细心的同学会发现,不同长度的数组打印出来的类型是不一样的。

所以不同长度的数组是不能互相赋值的:

代码语言:javascript
复制
a := [3]int{1, 2, 3}
b := [4]int{2, 3, 4, 5}
a = b  //这是错误的

2、传递坑

数组的传递属于值传递,每次传递都会被复制。

来看下代码:

代码语言:javascript
复制
a := [3]int{1, 2, 3} 
b := a
a[0] = 100

此时如果我们打印 a b 的值是否会一样呢?

答案是不一样的,修改 a 的值并不会影响到 b,因为他们是值传递,也就是复制了一份到b。

再来看一段代码:

代码语言:javascript
复制
func main{
 a := [2]int{1,2}
 sum(a)
 fmt.Println(a)
}

func sum(arr [2]int)  {
 arr[0] = 200
}

此时运行输出的结果会是什么呢?

没错,还是 [1, 2] ,值并不会被改变。

因为在传递到 sum 方法时是采用值复制的方式传递的。

所以一般在传递数组或者切片时,我们为了节省性能一般都传递指针。

最后,再次强调,Go 的基础数据类型里面是没有切片的,理解了么?

你学废了么?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Go 里面基础类型只有数组
  • 二、数组稍不注意就变切片了
  • 一不小心变切片:
  • 三、典型坑
    • 1、长度坑
      • 2、传递坑
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档