Go 中静态方法的等价性

Equivalence of static methods in Go

假设在 Java 中,我有 class CryptoFormat,它有一个名为 getLegacyFormat()[=32 的静态方法=].当我想使用该方法时,我只需要调用CryptoFormat.getLegacyFormat()。这很清楚,因为我知道方法来自哪里。

在 Go 中,没有静态方法。我真的不想只创建一个名为 crypto_format.go 的文件并在那里定义方法。原因是每当我需要该方法时,我只是调用 GetLegacyFormat(),它不包含该方法来自的上下文。

我想到了两种解决问题的方法:

  1. 创建一个名为cryptoformat 的单独包,并将方法定义为包中的全局函数。这样,我只需要为几种方法制作一个新包。另外,每当我需要这样的静态方法时,我都必须定义新的包。
  2. 定义一个名为 cryptoFormat 的结构,其中包含方法 GetLegacyFormat()。此外,定义一个名为 CryptoFormatglobal public 变量,它指向结构 cryptoFormat[=32] 的一个实例=].这样,我可以在需要方法时调用 CryptoFormat.GetLegacyFormat()。

不知道哪个更好,也不知道有没有更好的办法

我会说你提到的选项 1 是定义此类函数的更惯用的方法,如果它们不需要任何状态来保证将它们绑定到底层结构。

如果您希望将某些状态作为函数的上下文,那么选项 2 就是可行的方法。

请注意,在 Go 中,函数是 "first class citizens",因此您没有 Java 需要为静态方法定义 class 的限制。

是的,如果你想要一个单独的命名空间,你需要定义单独的包(就像在 Java 中一样,你需要定义单独的 classes and/or 包).

如果你希望你的实现是惯用的,我建议你看一下 Go 的标准库(选择几个包并探索它们如何实现它们的功能)以更好地了解通常的结构方式这个。

whenever I need the method, I just call GetLegacyFormat(), which doesn't contain the context where the method comes from.

因此请为函数名称添加上下文。

GetLegacyCryptoFormat()