理解 Go 中的类型别名
在 Go 中,类型别名可能会令人困惑。以下代码举例说明了这一点:
package main import ( "fmt" "time" ) type dur struct { time.Duration } type durWithMethods dur type durWithoutMethods time.Duration func main() { var d durWithMethods // works !! fmt.Println(d.String()) var dWM durWithoutMethods fmt.Println(dWM.String()) // doesn't compile }
为什么直接别名 durWithoutMethods 不继承任何方法,与 durWithMethods 不同?
类型声明和别名
为了理解这一点,我们需要区分类型声明和类型别名。类型声明创建一个新类型,从其基础类型中剥离所有方法。另一方面,类型别名只是将新标识符绑定到现有类型。
方法解析
对于 durWithMethods,新类型 durWithMethods 是使用 dur 作为其基础类型创建。由于 dur 嵌入了 time.Duration,time.Duration 的方法被提升为 dur。因此,可以使用简写 d.Duration.String() 来调用 d.String()。
剥离方法
但是,在 durWithoutMethods 中,直接别名time.Duration,所有方法都被剥离。由于 Duration.String() 是 time.Duration 的方法,因此它不会被 durWithoutMethods 继承。
真实类型别名
真实类型别名,另一方面手,使用 = 符号表示:
type sameAsDuration = time.Duration
这会创建 time.Duration 的别名,而无需剥离方法。因此,sad.String() 的调用方式与 d.String() 类似。
以上是为什么直接类型别名不继承 Go 中的方法?的详细内容。更多信息请关注PHP中文网其他相关文章!