类型别名和方法继承
考虑以下代码片段:
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 }
此代码演示了不同的方法创建类型别名及其对方法的影响继承。
类型别名与类型定义
Go 中,有两种类型的类型声明:别名和定义。
使用类型别名的方法继承
类型别名 durWithMethods 创建一个新类型,该类型从其基础类型继承方法, dur,它又嵌入 time.Duration。因此,durWithMethods 可以从 time.Duration 访问 String() 方法。
fmt.Println(d.String()) // works
相反,类型别名 durWithoutMethods 只是重命名 time.Duration。由于 time.Duration 是原始类型,因此它没有方法。因此,durWithoutMethods 没有 String() 方法。
fmt.Println(dWM.String()) // doesn't compile
具有相同基础类型的类型别名
真正的类型别名,它只是重命名现有类型,看起来像这样:
type sameAsDuration = time.Duration
在这种情况下,sameAsDuration 具有相同的方法作为 time.Duration 因为它代表相同的类型。
var sad sameAsDuration fmt.Println(sad.String()) // works
因此,由于类型别名和类型定义之间的细微差别以及它们对方法继承的影响而产生了混乱。类型别名保留其基础类型的方法,而类型定义则使用自己的一组方法创建新类型。
以上是Go 中的类型别名是否从其底层类型继承方法?的详细内容。更多信息请关注PHP中文网其他相关文章!