理解 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中文網其他相關文章!