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

问题描述

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

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 assigned 的表达式到类型为 {{1} 的变量},反之亦然。
  • 您可以在 func() error 上声明方法。

相反,openeralias declarationtype opener = func() error 被声明为 opener 类型的别名。

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

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