定义 []*struct 而不是 []struct 的好处是什么

2018-02-19 23:39:34 +08:00
 admirez
看到有很多定义是用 []*struct 这种类型,是添加删除的时候更方便?
1922 次点击
所在节点    Go 编程语言
14 条回复
neoblackcap
2018-02-19 23:47:31 +08:00
不是更省空间吗?
50infivedays
2018-02-19 23:48:24 +08:00
遍历的时候 如果涉及数组元素的修改有差异
MeteorCat
2018-02-19 23:48:55 +08:00
按照 C/C++引用和实例区别,应该就是指针指向,Go 语言开发快捷,不过我还是推荐如果有时间把 C 接触下一下,有的问题可以在 C 上找到答案
choulinlin
2018-02-20 06:25:46 +08:00
指针数组 cpu 里计算 不是更加省时省空间?
Mitt
2018-02-20 14:21:09 +08:00
一个是引用 一个是拷贝
deepzz
2018-02-20 18:20:42 +08:00
2l 不错,理解数据底层结构就知道用哪种了
wizardforcel
2018-02-20 21:19:24 +08:00
因为你只需要创建一个对象,而不是很多个对象 hhhhh
chengluyu
2018-02-20 22:14:14 +08:00
看你想怎么用了,如果你在某个函数体 /类中声明一个 struct[] 的话,这个数组中的结构体的生命周期等同于它的 enclosing scope,但是如果你想让这些东西在其 enclosing scope 生命周期结束后可用的话,就用一个 struct*[] 来保存这些结构体。
admirez
2018-02-20 22:38:49 +08:00
@chengluyu 如果我把 struct[] 给 return 了呢?生命期一样是离开函数体?
chengluyu
2018-02-21 15:15:24 +08:00
@admirez 不可以的,C++ 不能返回 type[],只能返回 type*。
Equim
2018-02-21 16:11:36 +08:00
首先,[]*struct 还真不一定比 []struct 好
1. 你的 struct 体积本身就可能比它的指针还小
2. 用指针也略微加大了逃逸分析的难度
3. 如果需要频繁地对这整个 slice 进行写时复制的话,后者方便得多,还可以省个锁

好处一般就是省空间、mutation 能统一了,除了刚刚说的那种情况,看你实际需求。
admirez
2018-02-22 14:02:14 +08:00
@chengluyu 我这样测试了下返回 []struct,是正常的

type sample struct {s string}

func Foo() []sample {
v := []sample{{"aa"},{"bb"}}
return v
}

func main(){
h := Foo()
h[1].s = "damn"
fmt.Print(h)
}
chengluyu
2018-02-22 14:13:27 +08:00
@admirez 啊哈原来你用的是 Go。我还以为是 C++。
picasso250
2018-02-22 15:28:11 +08:00
主要是为了一致性.如果全部都是
func (s *struct) xxx() {}
那么显然用[]*struct 更方便.

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

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

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

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

© 2021 V2EX