【问题标题】:What is the difference between ways to declare function type?声明函数类型的方式有什么区别?
【发布时间】:2021-07-10 06:14:07
【问题描述】:

我可以通过两种方式声明函数类型:

type opener = func() error

type opener func() error 

这些声明之间有什么区别?为什么要使用一个而不是另一个?

【问题讨论】:

    标签: go type-alias type-declaration


    【解决方案1】:

    根据语言规范,两者都是type declarations

    type opener func() error 是一个type definition。它引入了一个名为opener 的新类型,其基础类型为func() error

    • openerfunc() error 是不同的类型。它们不可互换。
    • 但是,作为Hymns For Disco points out,因为它们具有相同的底层类型(func() error),所以将openercan be assigned 类型的表达式转换为func() error 类型的变量,反之亦然。
    • 您可以在opener 上声明方法。

    相比之下,type opener = func() erroralias declarationopener 被声明为 func() error 类型的别名。

    • 这两种类型是“同义词”,完全可以互换。
    • 您不能在此处在opener 上声明方法,因为func() error 不是已定义的类型。在更一般的情况下,只有当别名类型是定义在与别名相同的包中的类型时,您才能在类型别名上声明方法。

    为语言添加类型别名的primary motivation(在Go 1.9 中)是逐步代码修复,即将类型从一个包移动到另一个包。类型别名还有一些其他利基用例,但您很可能希望使用 类型定义 而不是 别名声明

    【讨论】:

    • 在第二种情况下,openerfunc() error 实际上是可以互换的(至少在某种意义上,每种类型的值都可以分配给另一种类型的值。我不确定还有什么其他的可互换的含义将适用)。这是因为像func() error 这样的函数类型不是“定义类型”,所以它们在第二个assignability rule 下传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2011-01-20
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多