求大佬解答一下 Go 相关的问题

2021-01-29 15:10:47 +08:00
 xbh1794970183564

LZ 是 Java 转 go,目前对 go 的指针不是很理解,很多时候不明白为什么要用指针,比如下面的语句

var feeds []*Feed err = json.NewDecoder(file).Decode(&feeds) return feeds, err

这里没看明白为什么要用*Feed, 直接 Feed 为什么不行呢?

977 次点击
所在节点    问与答
11 条回复
xbh1794970183564
2021-01-29 15:11:15 +08:00
排版歪了。。。大佬谅解
cmostuor
2021-01-29 15:19:11 +08:00
var feeds []
*Feed, err = json.NewDecoder(file).Decode(&feeds)
return feeds, err

至于为啥要加* 有 c 或 c++语言经验的就知道这是指针运算符, go 语言是 c 语言开发的大佬领导团队开发的, 为的是解决并发问题
darksword21
2021-01-29 15:20:44 +08:00
@cmostuor 建议重新审题
darksword21
2021-01-29 15:23:57 +08:00
我觉得直接用 Feed 也可以,除非你有需要判断 != nil 的需求,当然具体的我了解也不深,刚毕业的喳喳,
最近正准备了解下总结一篇博客
darksword21
2021-01-29 15:24:53 +08:00
xbh1794970183564
2021-01-29 15:26:33 +08:00
@darksword21 主要刚开始学,看了几个代码,感觉很多地方都用了指针,但是又说不上来为什么要用,就很难受
carlclone
2021-01-29 15:38:33 +08:00
我的理解是 go 里没有引用传值,都是拷贝的,拷贝指针比拷贝结构体的开销小?不知道对不对。。
xbh1794970183564
2021-01-29 15:39:47 +08:00
@carlclone 好像有道理
seth19960929
2021-01-29 16:16:15 +08:00
其实道理很简单呀. 任何语言都是这样.
你把一个变量传进函数, 那么都是值传递, 无法从函数内部直接改变函数外的这个变量
****
当你传递一个引用或者指针, 那 Decode 函数就可以在内部对你这个变量进行赋值操作.

你试试传递:(注意 星星的位置)
var feeds *[]Feed = new([]Feed)
那你就不用传递引用了
lysS
2021-01-29 17:20:52 +08:00
func (dec *Decoder) Decode(v interface{}) error
没搞错吧?只用一个返回值 err 啊
BeautifulSoap
2021-01-29 17:28:33 +08:00
先不论这个代码。。。。

用指针主要是一般认为,传指针比传值的性能损耗小,而且传值还涉及到指拷贝的问题

但是在 go 里面这个问题也不是绝对的,因为你传指针的话还会遇到逃逸问题,有时候传指针性能还不如直接值拷贝好


所以对于 go 经验性来说,对于小的 struct 选择值拷贝性能较好,对于大的 struct 传指针性能会好

但是对于什么事小 struct,什么事大 struct,就没什么统一标准了。。。。

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

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

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

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

© 2021 V2EX