首頁  >  文章  >  後端開發  >  為什麼型別別名從嵌入型別繼承方法而不是從原始型別繼承方法?

為什麼型別別名從嵌入型別繼承方法而不是從原始型別繼承方法?

Barbara Streisand
Barbara Streisand原創
2024-11-16 09:50:03326瀏覽

Why does a type alias inherit methods from an embedded type but not from a raw type?

了解類型別名對方法繼承的影響

類型別名是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 中,型別宣告分為兩類:型別定義與型別別名。

  • 型別定義 create new型別並丟棄繼承的方法。
  • 型別別名只是將新識別碼綁定到現有型別。

在這種情況下,dur 是一個型別定義,而兩者都是durWithMethods 和 durWithoutMethods 是型別別名。

對方法繼承的影響

使用型別定義建立新型別(如 dur)時,它會遺失所有繼承的方法。這意味著 dur 本身並不具有 time.Duration 的 String() 方法。但是,當使用類型別名(如 durWithMethods)建立新類型時,它會繼承基礎類型的所有方法,在本例中為 dur。

Time.Duration 和原始類型

time.Duration 是原始類型,這意味著它不能有方法。但是,它可以嵌入到像 dur 這樣的結構中,這允許結構繼承其方法。

型別別名與直接別名

durWithoutMethods 是直接別名時間。持續時間。這種型別剝離行為是直接別名所特有的,不適用於像 durWithMethods 這樣的型別別名。

總之,durWithMethods 繼承了 time.Duration 的 String() 方法,因為它是嵌入時間的類型的別名.Duration、durWithoutMethods 不會繼承該方法,因為它是原始類型的直接別名。

以上是為什麼型別別名從嵌入型別繼承方法而不是從原始型別繼承方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn