首页 > 解决方案 > 用于文档目的的类型别名

问题描述

使用类型别名使 Go 代码更具自我记录性是否被认为是一种好习惯?一个例子:

type User struct {
    // user stuff
}

type Username = string

func Foo(users map[Username]User){
    // do stuff
}

很明显, Foo 需要从用户名到用户结构的映射,而无需在注释中解释任何内容,如果类型定义是map[string]User这种方法是否有任何负面影响,则可能需要这样做?

函数参数类似于局部变量,但它们也用作文档。

如果类型是描述性的,它们应该是简短的:

func AfterFunc(d Duration, f func()) *Timer

func Escape(w io.Writer, s []byte)

在类型更加模糊的情况下,名称可能会提供文档:

func Unix(sec, nsec int64) 时间

func HasPrefix(s, prefix []byte) bool

引自https://talks.golang.org/2014/names.slide#9。使类型不那么模棱两可似乎是一个有价值的目标。time.Duration 很简单type Duration int64,这不是别名,但纯粹从文档的角度来看,我认为效果是相似的。

标签: gotype-alias

解决方案


无论如何,别名声明都不会创建与创建它的类型不同的新的不同类型。它只是为 T2 表示的类型引入了一个别名 T1,一种替代拼写。

类型别名不适合日常使用。引入它们是为了支持逐步代码修复,同时在大规模重构期间在包之间移动类型。代码库重构(在 Go 的帮助下)详细介绍了这一点。

查看此提案以获取更多信息


推荐阅读