首頁 >後端開發 >Golang >Go 中的型別別名是否從其底層型別繼承方法?

Go 中的型別別名是否從其底層型別繼承方法?

DDD
DDD原創
2024-11-23 01:30:29672瀏覽

Do Type Aliases in Go Inherit Methods from Their Underlying Type?

類型別名和方法繼承

考慮以下代碼片段:

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

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