指针和值接收器类型之间有什么区别?

一些菜鸟学生

我正在编写一个程序,该程序从io.Reader读取数据并将其缓存在bytes.Buffer中。

type SecureReader struct {
    pipe      io.Reader
    shared    *[32]byte
    decrypted bytes.Buffer
}

func (s SecureReader) Read(b []byte) (int, error) {
    s.decryptPipeIntoBuffer()
    return s.decrypted.Read(b)
}

func (s SecureReader) decryptPipeIntoBuffer() (int, error) {/*Lots of code...*/}

我首先使用了值接收器,因为我认为它们是相同的。但是,我注意到我的方法在被调用时不会执行任何操作:SecureReader.Read()将始终返回io.EOF。

我猛地转过头,将接收器类型更改为

func (s *SecureReader) decryptPipeIntoBuffer() (int, error) {/*Lots of code...*/}

现在,我的代码神奇地起作用了。到底是怎么回事?

值接收器对实例副本进行操作SecureReaders

如果该方法改变了实例副本任何部分(例如Modify s.decrypted),则一旦该方法退出,它就不会在接收者的原始实例上可见。

随指针接收器而变化,因为该方法将在指针接收器处操作并可以更改实际SecureReader实例s,因为指针副本将传递给该方法。


请参阅“ Golang中的指针与非指针方法接收器不要被咬”中的更多示例

简而言之:您可以将接收方视为传递给方法的参数。您可能希望按值传递或按引用传递的所有相同原因均适用。

您希望通过引用而不是按值传递的原因:

  • 您实际上要修改接收器(“读/写”而不是“读”)
  • 结构非常大,深拷贝很昂贵
  • 一致性:如果结构上的某些方法具有指针接收器,则其余方法也应如此。这可以预测行为

如果在方法调用中需要这些特征,请使用指针接收器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

方法接收器和参数之间有什么区别?

来自分类Dev

活动中的意图过滤器和广播接收器之间有什么区别?

来自分类Dev

Sharepoint工作流和事件接收器有什么区别?

来自分类Dev

指针接收器和值接收器在Golang中是什么意思?

来自分类Dev

空指针常量(nullptr),空指针值和空成员指针值之间有什么区别?

来自分类Dev

使用指针和ref关键字引用值之间有什么区别

来自分类Dev

类型安全和类型推断之间有什么区别?

来自分类Dev

Golang-为什么我可以从值类型调用指针接收器方法?

来自分类Dev

指针和struct中的值有什么区别?

来自分类Dev

Java 8:方法参考绑定接收器和非绑定接收器之间的区别

来自分类Dev

指针和切片参考类型-接收器

来自分类Dev

TCP接收器和传输窗口之间的区别

来自分类Dev

类型和类之间有什么区别吗?

来自分类Dev

stripi内容类型和组件之间有什么区别?

来自分类Dev

LibGDX声音和音乐类型之间有什么区别?

来自分类Dev

这些类型的指针有什么区别?

来自分类Dev

Iris框架在实现指针接收器和值接收器方面的差异

来自分类Dev

枚举器,结构和类之间有什么区别?

来自分类Dev

模式值0777和777之间有什么区别

来自分类Dev

std :: shared_ptr的“拥有的指针”和“存储的指针”之间有什么区别?

来自分类Dev

指针和带有已分配内存的指针之间有什么区别?

来自分类Dev

定义函数类型和函数指针类型有什么区别?

来自分类Dev

方法集(指针与值接收器)

来自分类Dev

在RSpec中,消息期望(接收)和测试间谍(have_received)之间有什么区别?

来自分类Dev

CoffeeScript,=>和->之间有什么区别

来自分类Dev

(for ... in)和(for ... of)语句之间有什么区别?

来自分类Dev

R和with之间有什么区别?

来自分类Dev

R和with之间有什么区别?

来自分类Dev

$ @和“ $ @”之间有什么区别吗?

Related 相关文章

  1. 1

    方法接收器和参数之间有什么区别?

  2. 2

    活动中的意图过滤器和广播接收器之间有什么区别?

  3. 3

    Sharepoint工作流和事件接收器有什么区别?

  4. 4

    指针接收器和值接收器在Golang中是什么意思?

  5. 5

    空指针常量(nullptr),空指针值和空成员指针值之间有什么区别?

  6. 6

    使用指针和ref关键字引用值之间有什么区别

  7. 7

    类型安全和类型推断之间有什么区别?

  8. 8

    Golang-为什么我可以从值类型调用指针接收器方法?

  9. 9

    指针和struct中的值有什么区别?

  10. 10

    Java 8:方法参考绑定接收器和非绑定接收器之间的区别

  11. 11

    指针和切片参考类型-接收器

  12. 12

    TCP接收器和传输窗口之间的区别

  13. 13

    类型和类之间有什么区别吗?

  14. 14

    stripi内容类型和组件之间有什么区别?

  15. 15

    LibGDX声音和音乐类型之间有什么区别?

  16. 16

    这些类型的指针有什么区别?

  17. 17

    Iris框架在实现指针接收器和值接收器方面的差异

  18. 18

    枚举器,结构和类之间有什么区别?

  19. 19

    模式值0777和777之间有什么区别

  20. 20

    std :: shared_ptr的“拥有的指针”和“存储的指针”之间有什么区别?

  21. 21

    指针和带有已分配内存的指针之间有什么区别?

  22. 22

    定义函数类型和函数指针类型有什么区别?

  23. 23

    方法集(指针与值接收器)

  24. 24

    在RSpec中,消息期望(接收)和测试间谍(have_received)之间有什么区别?

  25. 25

    CoffeeScript,=>和->之间有什么区别

  26. 26

    (for ... in)和(for ... of)语句之间有什么区别?

  27. 27

    R和with之间有什么区别?

  28. 28

    R和with之间有什么区别?

  29. 29

    $ @和“ $ @”之间有什么区别吗?

热门标签

归档