我想知道何时或是否应该在 golang 中使用自己的类型。什么时候这样可以更友好地理解我的代码,或者什么时候我不应该使用自己的类型。
例子:
我想用 MAC 和 name host 创建 map
类型:
第一种方式是我能做到的最简单的方式
var machines map[string]string{
"11:22...": "myHost",
"22:33..": "yourHost",
}
第二种方式
type MAC string
type HOST string
machines := map[MAC]HOST{
MAC("11:22..") : HOST("myHost"),
MAC("22:33..") : HOST("yourHost"),
}
在上面的例子中,我可以在我的类型 MAC
上获得额外的控制,HOST
trought write method to validation, compare etc it is better ?
第三种方式
type MACHINES map[string]string
m := MACHINES{}
m = map[string]string{
"11:22.." : "myHost",
"22:33" : "yourHost",
}
上面的例子对我来说是最难理解的,对其他人来说不太直观。我认为上面的例子也应该填写关于 HOST 和 MAC 的内容,因为类型 MACHINE 没有说明开发人员应该如何实现,所以我想
type MACHINES map[MAC]HOST
但是,请发表评论以更好地了解 golang 中自身类型的用法。
最佳答案
在不评论您的具体示例的情况下,您通常希望使用新类型有几个原因:
- 你需要在类型上定义方法
- 您不希望该类型与它派生的类型的文字或变量进行比较(例如,为了减少用户混淆或确保他们不会做一些无效的事情,比如尝试将您的特殊字符串与其他字符串进行比较随机字符串)
- 您只需要一个地方来放置文档,或者对返回特定类型的方法进行分组(例如,如果您有多个返回
net.Conn
的 Dial 方法,您可以创建一个键入 Conn net.Conn
并返回它,而不是为了在 godoc 中将函数分组到 Conn 类型 header 下,或者为方法返回的 net.Conn 提供一般文档。 - 因为你希望人们能够检查你的包中是否有某种通用类型的东西(例如,即使你的 Conn 只是一个普通的 net.Conn,它也让你可以选择类型切换并检查是否它也是一个 yourpackage.Conn)
- 您希望函数从预定义的事物列表中获取参数,并且您不希望用户能够创建可以传入的新值(例如,未导出类型的导出常量列表)
关于go - 在 golang 中使用自己的类型的最佳实践。 Alians 构建类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268276/