将Go方法定义为远离结构定义有什么好处?

Aiv*_*var 6 struct go

Go允许一个方法与它们所使用的struct/datatype分开定义方法.这是否意味着只是灵活地放置方法定义或更多内容?

我听说Go的结构/方法系统与猴子修补相比较,但如果我理解正确,那么你真的不能将方法添加到任何现有的类型(struct),因为方法必须与类型位于同一个包中.IE浏览器.你可以只修补你控制下的类型.或者我错过了什么?

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

Den*_*ret 10

这是Go over基于类型的语言的一个优点:您可以根据需要组织文件:

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

经常,Go没有添加一个无用的约束.所以答案也可能是"为什么不"

您实际上无法将方法添加到任何现有类型(struct),因为方法必须与类型位于同一个包中

如果可以的话,如果在两个不同的包中的相同结构上使用相同的函数名,则可能无法确定要调用哪个函数.或者这会使某些软件包不兼容.


mna*_*mna 7

这是(部分可能)因为在Go中,你可以在任何类型上拥有方法,而不仅仅是struct:

type Age uint

func (a Age) Add(n Age) Age {
  return a + n
}
Run Code Online (Sandbox Code Playgroud)

这也是您可以向现有类型添加方法的方法.您所做的是根据现有类型定义新类型,并根据需要添加方法.


nem*_*emo 6

猴子补丁是不可能的.您定义方法的类型必须位于同一个包中.

您可以做的是在包内定义函数和方法.如果类型定义与该类型的方法定义位于同一文件中,则无关紧要.

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