Go中静态方法的等价性

时间:2017-07-09 00:12:23

标签: go static-methods

让我们说在Java中,我有类 CryptoFormat ,它有一个名为 getLegacyFormat()的静态方法。当我想使用该方法时,我只需要调用 CryptoFormat.getLegacyFormat()。这很清楚,因为我知道方法的来源。

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

我可以想出两种解决问题的方法:

  1. 创建一个名为 cryptoformat 的独立包,并将该方法定义为包中的全局函数。这样,我需要为几个方法创建一个新包。此外,每当我需要这样的静态方法时,我必须定义新的包。
  2. 定义名为 cryptoFormat 的结构,其中包含方法 GetLegacyFormat()。另外,定义名为 CryptoFormat 全局公共变量,该变量指向struct cryptoFormat 的实例。这样,当我需要这个方法时,我可以调用CryptoFormat.GetLegacyFormat()。
  3. 我不确定哪一个更好,或者是否有更好的方法。

2 个答案:

答案 0 :(得分:3)

我想说你提到的选项1是定义这些函数的更惯用的方法,如果他们不需要任何可以将它们绑定到底层结构的状态。

如果有某种状态,您希望将该功能作为上下文,那么选项2将是您的选择。

请注意,在Go中,函数是"一等公民",因此您没有Java需要为静态方法定义类的约束。

是的,如果你想要一个单独的命名空间,你需要定义单独的包(就像在Java中一样,你需要定义单独的类和/或包)。

如果您希望您的实现是惯用的,我建议您查看Go的标准库(选择一些软件包并探索它们如何实现其功能)以更好地了解通常的方法来构建这个。

答案 1 :(得分:2)

  

每当我需要这个方法时,我只调用GetLegacyFormat(),它不包含方法来源的上下文。

因此,请在函数名称中添加上下文。

GetLegacyCryptoFormat()