在 golang 中使用自己的类型的最佳实践。外星人建造类型

Mbd*_*ded 3 types go

我想知道何时或是否应该在 golang 中使用自己的类型。当这将更容易理解我的代码时,或者当我不应该使用自己的类型时。

示例:我想创建带有MAC 的map类型,并命名为 host

我可以用第一种最简单的方式做到这一点

var machines map[string]string{
   "11:22...": "myHost",
   "22:33..":  "yourHost",
}
Run Code Online (Sandbox Code Playgroud)

第二种方式

type MAC string
type HOST string

  machines := map[MAC]HOST{
       MAC("11:22..") : HOST("myHost"),
       MAC("22:33..") : HOST("yourHost"),
    }
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我可以对我的类型进行额外的控制MACHOST通过编写验证、比较等方法更好吗?

第三条路

type MACHINES map[string]string

m := MACHINES{}
    m = map[string]string{
     "11:22.." : "myHost",
     "22:33" : "yourHost",
    }
Run Code Online (Sandbox Code Playgroud)

上面的例子对我来说是最难理解的,对其他人来说不太直观。我认为上面的示例还应该填写有关 HOST 和 MAC 的内容,因为类型 MACHINE 没有说明开发人员应该如何实现,所以我想

  type MACHINES map[MAC]HOST
Run Code Online (Sandbox Code Playgroud)

但是,请评论以更好地了解 golang 中使用自己的类型。

小智 5

在不评论您的具体示例的情况下,您通常希望使用新类型有几个原因:

  • 您需要在类型上定义方法
  • 您不希望该类型与其派生类型的文字或变量进行比较(例如,为了减少用户混淆或确保他们不会做一些无效的事情,例如尝试将您的特殊字符串与其他随机字符串进行比较)
  • 您只需要一个地方来放置文档,或者对返回特定类型的方法进行分组(例如,如果您有多个返回 a 的 Dial 方法net.Conn,您可以创建一个type Conn net.Conn并返回它,而不只是为了将函数分组到 Conn 下在 godoc 中键入 header 或为方法返回的 net.Conn 提供一般文档)。
  • 因为您希望人们能够检查通用类型的某些内容是否来自您的包(例如,即使您的 Conn 只是一个普通的 net.Conn,它也为您提供了类型切换和检查它是否是您的包的选项.康恩也是如此)
  • 您希望函数从预定义的事物列表中获取参数,并且不希望用户能够创建可以传入的新值(例如,未导出类型的导出常量列表)