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