为什么在 Go 数组(array)被设计成值,而不跟 C/C++或 Java 一样,设计为一个引用?

2020-05-19 10:32:36 +08:00
 frankhuu
最近在入门学习 Go 中的 array 和 slice,能初步理解两者的区别,但是总是差一点意思,为什么数组要设计为值?为什么 Go 不能像 Java 等其他语言一样没有 slice,slice 究竟有多大的威力?
6618 次点击
所在节点    Go 编程语言
42 条回复
fighterlyt
2020-05-19 10:34:30 +08:00
slice 彻底突破了 array 的概念
piglovesx
2020-05-19 10:37:10 +08:00
建议用 ArrayList 和 slice 进行比较,底层都是 array 。
ethego
2020-05-19 10:40:06 +08:00
C 的 array 就是值啊
thet
2020-05-19 10:40:27 +08:00
slice 可变长,数组日常使用起来肯定不方便
mornlight
2020-05-19 10:49:49 +08:00
array 固定长度,一旦初始化分配好,就固定占用那么多内存空间,是连续的,不能缩短不能加长。
slice 帮你实现了动态伸缩数组的需求。其他语言肯定也有类似的结构。
mornlight
2020-05-19 10:51:05 +08:00
建议在 Go 里面不要使用「引用」这个词,把自己搞晕了。任何地方都是传值。
Vegetable
2020-05-19 10:55:28 +08:00
array 是底层设计,Go 也一直在暗示“不要用 Array”。所有你需要所谓引用的地方,都应该用切片。
nightwitch
2020-05-19 11:02:18 +08:00
c/c++的数组是值类型
mikurasa
2020-05-19 11:03:21 +08:00
slice 和 map 的底层都是 array map 的底层实现是桶+array
Jirajine
2020-05-19 11:44:09 +08:00
slice 就是其他语言的 vector,连续内存,智能动态伸缩,牺牲一点点微不足道的性能和内存占用。
mightofcode
2020-05-19 11:44:33 +08:00
go 语言的 slice 和 array 有心智包袱,容易让人混乱
ica10888
2020-05-19 15:19:38 +08:00
因为没有泛型...
xhp281
2020-05-19 15:27:33 +08:00
@mornlight 我看有的网课讲传地址的速度更快一些
janxin
2020-05-19 15:30:17 +08:00
因为 slice 不是 array
keepeye
2020-05-19 15:35:11 +08:00
python list:

a = [1,2,3]
b = a[:]
b[0] = 0
print(a) # [1,2,3]
print(b) # [0,2,3]

go slice:
a := []int{1,2,3}
b := a[:]
b[0] = 0
fmt.Println(a) // [0, 2, 3]

这就是区别了
Rwing
2020-05-19 16:03:18 +08:00
我来个 C#的

var a = new[] { 1, 2, 3 };
var b = a[..];
b[0] = 0;
Console.WriteLine(a); // [1,2,3]
Console.WriteLine(b); // [0,2,3]
hahasong
2020-05-19 16:17:41 +08:00
slice 就是引用的,尽量用 slice
qW7bo2FbzbC0
2020-05-19 16:27:20 +08:00
@mornlight 这个怎么理解,很多文章都说是&取地址 *取值
mornlight
2020-05-19 16:51:28 +08:00
@hjahgdthab750 #18 &取地址 这个描述没问题。取出来之后你赋值过去的就是一个指针类型的值,传参本质上是传递「指针值」,理解清楚了指针的概念这些就都简单了。

slice 经常被说成「引用类型」是因为它本质上是这样的 struct:
type slice struct {
array unsafe.Pointer
len int
cap int
}

传递 slice 等同于传递这样的一个 struct 值,只是值里面有一个指向底层 array 的指针,所以真正存放内容的 array 部分没有被 copy 。如果直接传一个 array 值,里面存放的内容是会被 copy 一次的。
Hellert
2020-05-19 16:54:00 +08:00
go 全是值类型

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/673135

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX