首頁 > 後端開發 > Golang > 主體

為什麼直接型別別名不繼承 Go 中的方法?

Linda Hamilton
發布: 2024-11-19 09:54:03
原創
133 人瀏覽過

Why Doesn't a Direct Type Alias Inherit Methods in Go?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板