LZ 是 Java 转 go,目前对 go 的指针不是很理解,很多时候不明白为什么要用指针,比如下面的语句
var feeds []*Feed err = json.NewDecoder(file).Decode(&feeds) return feeds, err
这里没看明白为什么要用*Feed, 直接 Feed 为什么不行呢?
1
xbh1794970183564 OP 排版歪了。。。大佬谅解
|
2
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 语言开发的大佬领导团队开发的, 为的是解决并发问题 |
3
darksword21 2021-01-29 15:20:44 +08:00
@cmostuor 建议重新审题
|
4
darksword21 2021-01-29 15:23:57 +08:00
我觉得直接用 Feed 也可以,除非你有需要判断 != nil 的需求,当然具体的我了解也不深,刚毕业的喳喳,
最近正准备了解下总结一篇博客 |
5
darksword21 2021-01-29 15:24:53 +08:00
|
6
xbh1794970183564 OP @darksword21 主要刚开始学,看了几个代码,感觉很多地方都用了指针,但是又说不上来为什么要用,就很难受
|
7
carlclone 2021-01-29 15:38:33 +08:00 via Android
我的理解是 go 里没有引用传值,都是拷贝的,拷贝指针比拷贝结构体的开销小?不知道对不对。。
|
8
xbh1794970183564 OP @carlclone 好像有道理
|
9
seth19960929 2021-01-29 16:16:15 +08:00
其实道理很简单呀. 任何语言都是这样.
你把一个变量传进函数, 那么都是值传递, 无法从函数内部直接改变函数外的这个变量 **** 当你传递一个引用或者指针, 那 Decode 函数就可以在内部对你这个变量进行赋值操作. 你试试传递:(注意 星星的位置) var feeds *[]Feed = new([]Feed) 那你就不用传递引用了 |
10
lysS 2021-01-29 17:20:52 +08:00
func (dec *Decoder) Decode(v interface{}) error
没搞错吧?只用一个返回值 err 啊 |
11
BeautifulSoap 2021-01-29 17:28:33 +08:00
先不论这个代码。。。。
用指针主要是一般认为,传指针比传值的性能损耗小,而且传值还涉及到指拷贝的问题 但是在 go 里面这个问题也不是绝对的,因为你传指针的话还会遇到逃逸问题,有时候传指针性能还不如直接值拷贝好 所以对于 go 经验性来说,对于小的 struct 选择值拷贝性能较好,对于大的 struct 传指针性能会好 但是对于什么事小 struct,什么事大 struct,就没什么统一标准了。。。。 |