不太明白 golang 官方设计 slice 这种数据结构的初衷在哪?

2019-07-09 21:48:39 +08:00
 Buffer2Disk

不太明白 golang 官方设计 slice 这种可变长数据结构的初衷在哪?是速度更快么还是?

为什么不能跟其他语言一样设计的易用一点呢,有没有大佬出来解惑一下的

感觉这个数据结构用起来要非常的小心,如果按照其他语言的模式来思考,就会产生意想不到的结果

比如下面这 2 个案例

https://v2ex.com/t/581264

https://www.zhihu.com/question/27161493

6162 次点击
所在节点    Go 编程语言
29 条回复
swulling
2019-07-10 12:31:42 +08:00
值传递有自己的好处,
calease
2019-07-10 12:53:12 +08:00
跟 slice 有什么关系。也根本不需要关心 slice 的 internal implementation。go 是 pass by value,所以如果要修改数据必须要 pass in pointer。如果别的需要修改数据的 pass in pointer 只有 slice 不用 pass in pointer 就会很 confusing。
sosilver
2019-07-10 13:04:03 +08:00
看起来有点不伦不类,像 std::span 和 std::vector 的混合体
fcten
2019-07-10 13:13:54 +08:00
因为易用和性能是冲突的,那么作为设计者就必然要权衡。

如果一个设计要损失 10%的性能,但是开发效率提升 100%,要不要?
如果一个设计要损失 50%的性能,但是开发效率提升 100%,要不要?

关于用其它语言的思维方式无法理解的问题,那是因为 Go 最初就是设计给 C/C++ 程序员用的。熟悉 C/C++ 思维模式的程序员应该很容易理解这些。
ChristopherWu
2019-07-10 22:20:40 +08:00
@fcten 这结论太虚了。从这个这么广的结论,你怎么样也要说『比如 go 的 slice 就为了 xx 的性能而舍弃了 xx 的易用,这是没办法的』
daryl
2019-07-11 10:31:07 +08:00
@myyou C 语言的那个应该叫变长数组(变量长度数组)吧,并不是动态的。
buzailianxi
2019-07-11 11:44:04 +08:00
其内部对 data 的引用变化 扩容时机 是造成困扰的主要原因。
scipio
2019-07-12 13:57:03 +08:00
答主被高级语言惯久了~
webee
2019-07-15 14:58:26 +08:00
一个 slice 值是对底层数组的一个固定切片,长度是不可变的,每次改变长度都是生成新的切片。
%p 对于 slice 来说返回的是底层数组的地址,真实的 slice 值的地址需要取地址符&。

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

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

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

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

© 2021 V2EX