Go 对类型别名的行为感到困惑

Go 对类型别名的行为感到困惑,go,types,Go,Types,考虑以下代码(也在上): 我不明白为什么time.Duration的直接别名不继承任何方法。是因为time.Duration是原始类型的别名吗?有两种形式:别名声明和类型定义 类型定义创建一个新类型并剥离所有方法。类型别名“just”创建(绑定)同一类型的新标识符。使用“原始”名称或新名称是相同的 您的第一个示例: type durWithMethods dur 这将创建一个新类型durWithMethods,它将dur作为其基础类型。由于基础类型是嵌入time.Duration的结构,因此嵌

考虑以下代码(也在上):

我不明白为什么
time.Duration
的直接别名不继承任何方法。是因为
time.Duration
是原始类型的别名吗?

有两种形式:别名声明和类型定义

类型定义创建一个新类型并剥离所有方法。类型别名“just”创建(绑定)同一类型的新标识符。使用“原始”名称或新名称是相同的

您的第一个示例:

type durWithMethods dur
这将创建一个新类型
durWithMethods
,它将
dur
作为其基础类型。由于基础类型是嵌入
time.Duration
的结构,因此嵌入类型的方法将得到提升,并将成为嵌入程序类型的一部分,因此
dur
durWithMethods
Duration.String()
无论创建新类型都将得到提升,因为此
String()
方法不是
dur的方法,而是
time.Duration的方法

当您编写
d.String()
时,它将是
d.Duration.String()
的简写

第二个例子:

type durWithoutMethods time.Duration
创建一个新类型
durWithoutMethods
,该类型再次剥离所有方法。由于
Duration.String()
time.Duration
的一种方法,因此它不会是
durWithoutMethods
的方法

实际类型别名如下所示:

type sameAsDuration = time.Duration
由于它表示相同的类型,因此它还有
String()
方法:

var sad sameAsDuration
fmt.Println(sad.String()) // works

1.这不是类型别名。这是一个简单的类型delcaration。2.围棋完全没有继承性。句号。但是如果你嵌入,就像你在
dur
中所做的那样,那么你可以访问嵌入类型的方法。我不知道为什么有两个人选择否决你的问题。但要求解释投票的原因确实不合适,因为投票是故意匿名的。
var sad sameAsDuration
fmt.Println(sad.String()) // works