栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

值接收器与指针接收器

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

值接收器与指针接收器

请注意,FAQ确实提到了一致性

接下来是一致性。如果该类型的某些方法必须具有指针接收器,则其余方法也应该具有指针接收器,因此无论如何使用该类型,方法集都是一致的。有关详细信息,请参见有关方法集的部分。

如本线程所述:

关于指针与接收器的值的规则是,可以在指针和值上调用值方法,但是只能在指针上调用指针方法

现在:

有人可以告诉我一个值接收器比指针接收器更有意义的情况吗?

该代码评审意见可以帮助:

  • 如果接收方是地图,函子或频道,请不要使用指向它的指针。
  • 如果接收方是切片,并且该方法未重新切片或重新分配切片,请不要使用指向该切片的指针。
  • 如果该方法需要更改接收方,则接收方必须是指针。
  • 如果接收方是包含一个
    sync.Mutex
    或类似同步字段的结构,则接收方必须是一个指针以避免复制。
  • 如果接收器是大型结构或数组,则指针接收器效率更高。多大?假设这等效于将其所有元素作为参数传递给方法。如果感觉太大,则对于接收器来说也太大。
    *函数或方法(同时执行或从该方法调用时)是否会使接收方发生变化?值类型在调用方法时创建接收方的副本,因此外部更新将不会应用于此接收方。如果更改必须在原始接收器中可见,则接收器必须是指针。
  • 如果接收方是结构,数组或切片,并且其任何元素都是指向可能正在变异的对象的指针,则最好使用指针接收方,因为它将使读者更加清楚意图。
  • 如果接收者是一个小的数组或结构,它自然是一个值类型
    (例如,类似该
    time.Time
    类型的东西),没有可变字段且没有指针,或者仅仅是一个简单的基本类型(如int或string),则
    值接收器会感
    值接收器可以减少可以生成的垃圾数量;
    如果将值传递给value方法,则可以使用堆栈上的副本来代替在堆上分配。
    (编译器会尽量避免这种分配,但是它不可能总是成功。)由于这个原因,请勿在没有进行概要分析的情况下选择值接收器类型。
  • 最后,如有疑问,请使用指针接收器。

粗体部分例如在中找到

net/http/server.go#Write()

// Write writes the headers described in h to w.//// This method has a value receiver, despite the somewhat large size// of h, because it prevents an allocation. The escape analysis isn't// smart enough to realize this function doesn't mutate h.func (h extraHeader) Write(w *bufio.Writer) {...}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376047.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号