了解類型別名對方法繼承的影響
類型別名是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 }
程式碼聲明了三種類型:dur、durWithMethods 和 durWithoutMethods。 dur 類型是嵌入 time.Duration 的結構體。類型 durWithMethods 被定義為 dur 的別名。另一方面,型別 durWithoutMethods 是 time.Duration 的別名。
問題是為什麼 durWithMethods 繼承了 time.Duration 的 String() 方法,而 durWithoutMethods 卻沒有。
型別宣告與方法繼承
在 Go 中,型別宣告分為兩類:型別定義與型別別名。
在這種情況下,dur 是一個型別定義,而兩者都是durWithMethods 和 durWithoutMethods 是型別別名。
對方法繼承的影響
使用型別定義建立新型別(如 dur)時,它會遺失所有繼承的方法。這意味著 dur 本身並不具有 time.Duration 的 String() 方法。但是,當使用類型別名(如 durWithMethods)建立新類型時,它會繼承基礎類型的所有方法,在本例中為 dur。
Time.Duration 和原始類型
time.Duration 是原始類型,這意味著它不能有方法。但是,它可以嵌入到像 dur 這樣的結構中,這允許結構繼承其方法。
型別別名與直接別名
durWithoutMethods 是直接別名時間。持續時間。這種型別剝離行為是直接別名所特有的,不適用於像 durWithMethods 這樣的型別別名。
總之,durWithMethods 繼承了 time.Duration 的 String() 方法,因為它是嵌入時間的類型的別名.Duration、durWithoutMethods 不會繼承該方法,因為它是原始類型的直接別名。
以上是為什麼型別別名從嵌入型別繼承方法而不是從原始型別繼承方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!