【发布时间】:2021-07-10 06:14:07
【问题描述】:
我可以通过两种方式声明函数类型:
type opener = func() error
type opener func() error
这些声明之间有什么区别?为什么要使用一个而不是另一个?
【问题讨论】:
标签: go type-alias type-declaration
我可以通过两种方式声明函数类型:
type opener = func() error
type opener func() error
这些声明之间有什么区别?为什么要使用一个而不是另一个?
【问题讨论】:
标签: go type-alias type-declaration
根据语言规范,两者都是type declarations。
type opener func() error 是一个type definition。它引入了一个名为opener 的新类型,其基础类型为func() error。
opener 和 func() error 是不同的类型。它们不可互换。func() error),所以将openercan be assigned 类型的表达式转换为func() error 类型的变量,反之亦然。opener 上声明方法。相比之下,type opener = func() error 是 alias declaration:opener 被声明为 func() error 类型的别名。
opener 上声明方法,因为func() error 不是已定义的类型。在更一般的情况下,只有当别名类型是定义在与别名相同的包中的类型时,您才能在类型别名上声明方法。为语言添加类型别名的primary motivation(在Go 1.9 中)是逐步代码修复,即将类型从一个包移动到另一个包。类型别名还有一些其他利基用例,但您很可能希望使用 类型定义 而不是 别名声明。
【讨论】:
opener 和 func() error 实际上是可以互换的(至少在某种意义上,每种类型的值都可以分配给另一种类型的值。我不确定还有什么其他的可互换的含义将适用)。这是因为像func() error 这样的函数类型不是“定义类型”,所以它们在第二个assignability rule 下传递。