6

Go 允许将方法与它们所处理的结构/数据类型分开定义。这是否意味着放置方法定义的灵活性或更多?

我听说 Go 的 struct/methods 系统被比作猴子补丁,但如果我理解正确,那么你真的不能将方法添加到任何现有类型(结构),因为方法必须与类型位于同一个包中。IE。无论如何,您只能对受您控制的类型进行修补。还是我错过了什么?

在哪些情况下,您会在单独的源文件(或同一源文件的不同部分)中定义类型及其方法?

4

3 回答 3

10

这是 Go over 基于类型的语言的一个优势:您可以随意组织文件:

  • 你可以把所有类似的功能放在一起,即使有很多接收器类型
  • 您可以拆分一个否则会太大的文件

通常,Go 没有添加无用的约束。所以答案也可能是“为什么不”

您真的不能将方法添加到任何现有类型(结构),因为方法必须与类型位于同一包中

如果可以,您可能无法确定在两个不同包中的同一结构上使用相同函数名的情况下调用哪个函数。或者这会使某些软件包不兼容。

于 2012-10-16T10:57:21.893 回答
7

This is (partly, probably) because in Go, you can have methods on any type, not just struct:

type Age uint

func (a Age) Add(n Age) Age {
  return a + n
}

This is also how you can add methods to an existing type. What you do is define a new type based on that existing type, and add methods as you like.

于 2012-10-16T12:50:07.633 回答
6

在 go 中无法进行猴子修补。您定义方法的类型必须位于同一个包中。

您可以做的是在包内任何您喜欢的地方定义函数和方法。类型定义是否与该类型的方法定义在同一个文件中并不重要。

这使得可以将所有类型定义分组到一个文件中,并将方法实现放在另一个文件中。可能与方法所需的其他助手一起使用。

于 2012-10-16T10:59:20.667 回答