使用类型别名使go代码更具自记录性是否被认为是一种好习惯?一个例子:
type User struct {
// user stuff
}
type Username = string
func Foo(users map[Username]User){
// do stuff
}
很明显,Foo从用户名映射到用户结构,而无需解释注释中的任何内容,如果类型定义为,则可能需要map[string]User
使用此方法吗?
函数参数就像局部变量一样,但是它们也可以作为文档。
如果类型是描述性的,则应简短:
func AfterFunc(d持续时间,f func())*计时器
func Escape(w io.Writer,s [] byte)
如果类型比较不明确,则这些名称可能会提供说明文件:
func Unix(sec,nsec int64)时间
func HasPrefix(s,前缀[] byte)布尔
引用自https://talks.golang.org/2014/names.slide#9。使类型减少歧义似乎是一个值得追求的目标。time.Duration只是简单的type Duration int64
,它不是别名,但是纯粹从文档的角度来看,我认为效果是相似的。
我犹豫要回答,因为这最终是一个自以为是的问题。但是我避免这种情况的原因是:
map[string]User
应该将用户名映射到用户的上下文中应该很清楚。如果你有多个相似的映射,例如,一个映射用户名,一个映射用户ID,则变量名应消除歧义。如果不是,则类型别名也可能不够。你需要一些清晰的文档。
您对常规def会说同样的话
type Username string
吗?@ mh-cbon:并非所有要点都适用于stabdard类型定义。您要问哪一个?通常,尽管如此,我更喜欢为功能保留类型定义,而不是文档。我发现不断地在命名类型和基本类型之间来回转换类型是很麻烦的,除了在类型中内置了功能之外,我宁愿避免使用它。
I find constantly type converting back and forth between a named type and a base type to be cumbersome, and prefer to avoid it except when I have functionality built into a type.
这是我同意的一个很好的理由。我提出了要点,以防OP对各种类型定义感到困惑。在命名类型和基类型之间进行转换的问题不适用于类型别名,因为类型别名实际上并不创建类型,因此在我的示例中使用纯字符串可以,对吗?这实际上是我从使用类型别名获得的好处之一。
@ user2133814:对,转换是不是适用于别名。