首页 文章

我应该用指向结构的指针还是仅仅在结构上定义我的func?

提问于
浏览
-1

在我看来,我似乎有两个选择:

foo := Thing{}
foo.bar()

foo := &Thing{}
foo.bar()


func (self Thing) bar() {
}

func (self *Thing) bar() {
}

用自己的东西或自我*事物来定义我的函数的更好的方法是什么?

编辑:这不是关于方法和函数的问题的重复 . 这个问题与Thing和&Thing有关,我认为这与它自己的网址有所不同 .

2 回答

  • 2

    看一下the official FAQ中的这个项目:

    对于不习惯指针的程序员来说,这两个例子之间的区别可能令人困惑,但实际上情况非常简单 . 在类型上定义方法时,接收器(上例中的s)的行为就像它是方法的参数一样 . 然后,将函数参数定义为值还是指针,将接收器定义为值还是指针都是同一个问题 . 有几个注意事项 . 首先,最重要的是,该方法是否需要修改接收器?如果是,接收器必须是指针 . (切片和贴图充当引用,因此它们的故事更加微妙,但是例如在接收方必须仍然是指针的方法中更改切片的长度 . )在上面的示例中,如果pointerMethod修改了字段s,调用者将看到这些更改,但是使用调用者参数的副本调用valueMethod(这是传递值的定义),因此对调用者所做的更改将对调用者不可见 . 顺便说一句,指针接收器与Java中的情况相同,尽管在Java中,指针隐藏在封面下; Go的 Value 接收器是不寻常的 . 其次是效率的考虑 . 如果接收器很大,例如一个大的结构,使用指针接收器会便宜得多 . 接下来是一致性 . 如果该类型的某些方法必须具有指针接收器,则其余方法也应如此,因此无论使用何种类型,方法集都是一致的 . 有关详细信息,请参阅方法集部分 . 对于诸如基本类型,切片和小结构之类的类型,值接收器非常便宜,因此除非方法的语义需要指针,否则值接收器是高效且清晰的 .

  • 1

    没有一个明确的答案,但它们完全不同 . 当你不使用指针时,你'通过值传递'意味着你调用它的对象将是不可变的(修改副本),当你使用你通过引用传递的指针时 . 我会更频繁地说你使用指针变种,但它是完全情境化的,没有“更好的方法” .

    如果你看一下各种编程框架/类库,你会看到许多例子,作者故意选择按 Value 或参考做事 . 例如,在C#.NET中,这是结构和类之间的根本区别,而 GuidDateTime 等类型被故意实现为结构(值类型) . 同样,我认为指针通常是更好的选择(如果你看一下.NET几乎所有东西都是类,引用类型),但它肯定取决于你希望用类型和/或你想要的消费者实现什么/其他开发人员与之互动 . 您可能需要考虑性能和并发性(也许您希望所有内容都是值,因此您不必担心类型上的并发操作,也许您需要一个指针,因为对象内存占用很大并且复制它会使您的程序太慢或消耗) .

相关问题