go - 在 golang 中使用自己的类型的最佳实践。 Alians 构建类型

标签 go types

我想知道何时或是否应该在 golang 中使用自己的类型。什么时候这样可以更友好地理解我的代码,或者什么时候我不应该使用自己的类型。

例子: 我想用 MACname 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/

相关文章:

multithreading - Web 服务器中长时间运行的任务

bash - 如何在Go(golang)中直接调用系统外壳?

interface - 如何获取未知接口(interface)上的结构值{}

go - 完成后,运行/ vert / build /测试命令挂起。忽略中断信号

python - 为什么具有相同 `id` 的两个函数可以具有不同的属性?

haskell - 为什么不在 Haskell 中进行类型检查?

python - c++中python "type(<name>, <bases>, <dict>)"的等价物是什么?

java - 读取 5 个字节并存储为 long

go - 如何在 Go 结构中设置默认值

typescript - 获取函数/类构造函数的参数类型