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

[Go 函数的值接收者和指针接收者]疑惑

  •  
  •   MoonWalker · 2022-04-02 10:15:01 +08:00 · 1639 次点击
    这是一个创建于 959 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有人在一篇博文中写到: "使用指针作为方法的接收者的理由:

    方法能够修改接收者指向的值; 避免在每次调用方法时复制该值, 在值的类型为大型结构体时, 这样做会更加高效; 但是判断使用值接收者还是指针接收者,不是由该方法是否修改了调用者(也就是接收者)来决定,而是应该基于该类型的本质。

    如果类型具备 "原始的本质",也就是说它的成员都是由 go 语言里内置的原始类型,如字符串,整型值等,那就定义值接收者类型的方法。像内置的复合类型,如 slice ,map ,interface ,channel ,这些类型比较特殊,声明他们的时候,实际上是创建了一个 header , 对于他们也是直接定义值接收者类型的方法。这样,调用函数时,是直接 copy 了这些类型的 header ,而 header 本身就是为复制设计的。

    如果类型具备非原始的本质,不能被安全地复制,这种类型总是应该被共享,那就定义指针接收者的方法。比如 go 源码里的文件结构体( struct File )就不应该被复制,应该只有一份实体"

    对此不是很能理解,什么叫非原始的本质,不能被安全的复制指的到底是什么意思

    5 条回复    2022-04-04 04:37:44 +08:00
    hello2090
        2
    hello2090  
       2022-04-02 10:45:45 +08:00 via iPhone
    这有啥惑的,我这种不会 go 的都能猜出来,primitive 类型存的是值,类类型存的是指针呗。
    MoonWalker
        3
    MoonWalker  
    OP
       2022-04-02 11:11:43 +08:00
    @jasonkayzk 看了下带佬的博客,懂的实在是太多了😄
    labulaka521
        4
    labulaka521  
       2022-04-02 19:15:26 +08:00 via iPhone
    sync.mutex 复制下试试
    yrj
        5
    yrj  
       2022-04-04 04:37:44 +08:00
    也许” 非原始本质”指的是基础类型吧,反正我偶尔也直接*bool 这样用,好像没什么不拖:)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2680 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:03 · PVG 13:03 · LAX 21:03 · JFK 00:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.