C語言中文網 目錄

Go語言構造函數

Go 語言的類型或結構體沒有構造函數的功能。結構體的初始化過程可以使用函數封裝實現。

其他編程語言構造函數的一些常見功能及特性如下:
  • 每個類可以添加構造函數,多個構造函數使用函數重載實現。
  • 構造函數一般與類名同名,且沒有返回值。
  • 構造函數有一個靜態構造函數,一般用這個特性來調用父類的構造函數。
  • 對于 C++ 來說,還有默認構造函數、拷貝構造函數等。

多種方式創建和初始化結構體——模擬構造函數重載

如果使用結構體描述貓的特性,那么根據貓的顏色和名字可以有不同種類的貓。那么不同的顏色和名字就是結構體的字段,同時可以使用顏色和名字構造不同種類的貓的實例,這個過程可以參考下面的代碼:
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 語言中沒有提供構造函數相關的特殊機制,用戶根據自己的需求,將參數使用函數傳遞到結構體構造參數中即可完成構造函數的任務。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo