go - 声明函数类型的方法有什么区别?

标签 go type-alias type-declaration

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

type opener = func() error

type opener func() error 
这些声明有什么区别?你为什么要使用一个?

最佳答案

根据语言规范,两者都是 type declarations .type opener func() error type definition .它引入了一个名为 opener 的新类型。其底层类型为 func() error .

  • openerfunc() error是不同的类型。它们不可互换。
  • 但是,如 Hymns For Disco points out ,因为它们具有相同的基础类型( func() error ),类型为 opener 的表达式can be assignedfunc() error 类型的变量,反之亦然。
  • 您可以在 opener 上声明方法.

  • 相比之下,type opener = func() erroralias declaration :opener被声明为 func() error 的别名类型。
  • 这两种类型是“同义词”并且完全可以互换。
  • 您不能在 opener 上声明方法这里是因为 func() error不是定义的类型。在更一般的情况下,只有当别名类型是在与别名相同的包中定义的类型时,您才能在类型别名上声明方法。

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

    关于go - 声明函数类型的方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68325216/

    相关文章:

    go - 如果我使用 go.mod,如何使用 gotext extract?

    c++ - 如何检查函数中的模板参数是否匹配给定类型别名的特化

    是否存在 TypeScript 错误?声明仅在以特定格式编写时有效

    javascript - 如何覆盖 TypeScript UMD 全局类型定义?

    go - 循环内的互斥导致意外输出

    networking - Go 中的点对点网络

    arrays - TypeScript 函数数组

    elm - 何时在Elm中使用类型别名与单值联合类型

    haskell - 如何与外部上下文中的类型相关联

    http - 从 golang 中的 reader.io 对象获取属性