首頁 >後端開發 >Golang >go語言有建構子嗎

go語言有建構子嗎

青灯夜游
青灯夜游原創
2023-01-10 14:15:421402瀏覽

go語言沒有建構子。 go語言作為結構化的語言是沒有物件導向語言中的建構方法的,不過可以透過一些方式實現類似的物件導向語言中建構方法的效果,也就是使用結構體初始化的過程來模擬實現構造函數。

go語言有建構子嗎

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

建構子是一種特殊的方法,主要用來在創建對象時初始化對象,也就是為對象成員變數賦初始值。特別的一個類別可以有多個建構函數 ,可根據其參數個數的不同或參數類型的不同來區分它們,即建構函數的重載。

Golang作為結構化的語言是沒有物件導向語言中的建構方法的,但是Golang卻可以像C 一樣實作類似繼承、建構函式一樣等物件導向程式設計的想法和方法。

因為 struct 是值型,如果結構體比較複雜的話,值拷貝 效能開銷會比較大,所以該建構函式回傳的是結構體指標型別。

規格

  • New 關鍵字開頭

  • # 傳回結構體指標

多種方式建立和初始化結構體-模擬建構子重載

#如果使用結構體來描述貓的特性,那麼根據貓的顏色和名字可以有不同種類的貓,那麼不同的顏色和名字就是結構體的字段,同時可以使用顏色和名字構造不同種類的貓的實例,這個過程可以參考下面的代碼:

type Cat struct {
    Color string
    Name  string
}
func NewCatByName(name string) *Cat {
    return &Cat{
        Name: name,
    }
}
func NewCatByColor(color string) *Cat {
    return &Cat{
        Color: color,
    }
}

程式碼說明如下:

  • 第1 行定義Cat 結構,包含顏色和名字欄位。

  • 第 6 行定義用名字建構貓結構的函數,傳回 Cat 指標。

  • 第 7 行取位址實例化貓的結構體。

  • 第 8 行初始化貓的名字字段,忽略顏色字段。

  • 第 12 行定義用顏色建構貓結構的函數,並傳回 Cat 指標。

在這個範例中,顏色和名字兩個屬性的型別都是字串,由於Go語言中沒有函數重載,為了避免函數名字衝突,使用NewCatByName() 和NewCatByColor() 兩個不同的函數名稱表示不同的Cat 建構過程。

帶有父子關係的結構體的建構與初始化-模擬父級構造呼叫

#黑貓是一種貓,貓是黑貓的一種泛稱,同時描述這兩種概念時,就是派生,黑貓派生自貓的種類,使用結構體描述貓和黑貓的關係時,將貓(Cat)的結構體嵌入到黑貓(BlackCat)中,表示黑貓擁有貓的特性,然後再使用兩個不同的建構子分別建構出黑貓和貓兩個結構體實例,參考下面的程式碼:

type Cat struct {
    Color string
    Name  string
}
type BlackCat struct {
    Cat  // 嵌入Cat, 类似于派生
}
// “构造基类”
func NewCat(name string) *Cat {
    return &Cat{
        Name: name,
    }
}
// “构造子类”
func NewBlackCat(color string) *BlackCat {
    cat := &BlackCat{}
    cat.Color = color
    return cat
}

程式碼說明如下:

  • 第6 行,定義BlackCat 結構,並嵌入了Cat 結構體,BlackCat 擁有Cat 的所有成員,實例化後可以自由存取Cat 的所有成員。

  • 第 11 行,NewCat() 函式定義了 Cat 的建構過程,使用名字作為參數,填滿 Cat 結構體。

  • 第 18 行,NewBlackCat() 使用 color 作為參數,建構傳回 BlackCat 指標。

  • 第 19 行,實例化 BlackCat 結構,此時 Cat 也同時被實例化。

  • 第 20 行,填滿 BlackCat 中嵌入的 Cat 顏色屬性,BlackCat 沒有任何成員,所有的成員都來自 Cat。

這個例子中,Cat 結構體類似於物件導向中的“基底類別”,BlackCat 嵌入Cat 結構體,類似於物件導向中的“衍生”,實例化時, BlackCat 中的Cat 也會被實例化。

總之,Go語言中沒有提供與建構函數相關的特殊機制,使用者根據自己的需求,將參數使用函數傳遞到結構體建構參數中即可完成建構函數的任務。

【相關推薦:Go影片教學程式設計教學

以上是go語言有建構子嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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