類型別名和方法繼承
考慮以下代碼片段:
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中文網其他相關文章!