V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xbh1794970183564
V2EX  ›  问与答

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

  •  
  •   xbh1794970183564 · 2021-01-29 15:10:47 +08:00 · 965 次点击
    这是一个创建于 1155 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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


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

    但是对于什么事小 struct,什么事大 struct,就没什么统一标准了。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3426 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:35 · PVG 18:35 · LAX 03:35 · JFK 06:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.