首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
xeaglex
V2EX  ›  Go

非指针方法在什么时候使用?

  •  
  •   xeaglex · 362 天前 · 2489 次点击
    这是一个创建于 362 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们都知道,Go 语言中的方法有两种,指针方法和非指针方法(其实我不确定是否叫这名)。其区别在于,调用非指针方法时,调用者会被拷贝。

    func (r *Receiver)F() // 指针方法
    func (r Receiver)F() // 非指针方法
    

    用了一段时间 Go 以后,我发现,我从来没用过非指针方法,因为我认为额外的拷贝工作会造成性能的损失。我猜这是因为我用的时间太短,没遇到必须使用非指针方法的场景。

    那么问题来了,到底什么情况下必须使用非指针方法,或使用非指针方法更优呢?

    13 回复  |  直到 2019-01-29 00:52:10 +08:00
    Trim21
        1
    Trim21   362 天前 via Android
    obj.copy(), obj.clone() ((((
    bigpigeon
        2
    bigpigeon   362 天前
    我记得 go 初始教程就有讲的,go 的 method 就是个函数语法糖
    指针方法等于 func F(r *Receiver)
    非指针就是 func F(r Receiver)
    blless
        3
    blless   362 天前 via Android
    值类型跟引用类型分得清不,差不多类似,比如 time.Time 类型就是基本都是用值类型,然后它的操作方法就基本都是非指针方法
    blless
        4
    blless   362 天前 via Android
    想了想感觉没说清楚,只是举个例子,还是先了解一下值类型传递跟引用类型传递概念吧
    janxin
        5
    janxin   362 天前 via iPhone
    zjdznl
        6
    zjdznl   362 天前 via Android
    当你不确定用什么的时候,用指针 receive 就行了。
    reus
        7
    reus   362 天前   ♥ 1
    不要看到复制就以为性能低,内存复制很快的,用指针还要解指针,一样是要付出代价的
    不需要改变的对象,就用值,需要改变的,就用指针
    freestyle
        8
    freestyle   362 天前 via iPhone
    传值用于字段不多的结构体的除了改值和反射的情况. https://segment.com/blog/allocation-efficiency-in-high-performance-go-services
    myyou
        9
    myyou   362 天前   ♥ 1
    指针多了并不一定增加性能,反而会增加 gc 压力,从而降低性能
    bumz
        10
    bumz   362 天前
    当你的 struct 只有 a few words,并且不需要修改,比如值语义的时候
    neoblackcap
        11
    neoblackcap   362 天前
    需要修改实例就用指针,不需要就用非指针版本。
    xeaglex
        12
    xeaglex   361 天前 via Android
    @reus 谢谢
    xeaglex
        13
    xeaglex   361 天前 via Android
    @myyou 谢谢,这么说就很明白了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2122 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 13:46 · PVG 21:46 · LAX 05:46 · JFK 08:46
    ♥ Do have faith in what you're doing.