C語言中文網 目錄

Go語言類型內嵌和結構體內嵌

結構體允許其成員字段在聲明時沒有字段名而只有類型,這種形式的字段被稱為類型內嵌或匿名字段類型內嵌的寫法如下:
type Data struct {
    int
    float32
    bool
}

ins := &Data{
    int:     10,
    float32: 3.14,
    bool:    true,
}
代碼說明如下:
  • 第 2~4 行定義結構體中的匿名字段,類型分別是整型、浮點、布爾。
  • 第 8~10 行將實例化的 Data 中的字段賦初值。

類型內嵌其實仍然擁有自己的字段名,只是字段名就是其類型本身而已,結構體要求字段名稱必須唯一,因此一個結構體中同種類型的匿名字段只能有一個。

結構體實例化后,如果匿名的字段類型為結構體,那么可以直接訪問匿名結構體里的所有成員,這種方式被稱為結構體內嵌。

聲明結構體內嵌

結構體類型內嵌比普通類型內嵌的概念復雜一些,下面通過一個實例來理解。

計算機圖形學中的顏色有兩種類型,一種是包含紅、綠、藍三原色的基礎顏色;另一種是在基礎顏色之外增加透明度的顏色。透明度在顏色中叫 Alpha,范圍為 0~1 之間。0 表示完全透明,1 表示不透明。使用傳統的結構體字段的方法定義基礎顏色和帶有透明度顏色的過程代碼如下:
package main

import (
    "fmt"
)

// 基礎顏色
type BasicColor struct {
    // 紅、綠、藍三種顏色分量
    R, G, B float32
}

// 完整顏色定義
type Color struct {

    // 將基本顏色作為成員
    Basic BasicColor

    // 透明度
    Alpha float32
}

func main() {

    var c Color

    // 設置基本顏色分量
    c.Basic.R = 1
    c.Basic.G = 1
    c.Basic.B = 0

    // 設置透明度
    c.Alpha = 1

    // 顯示整個結構體內容
    fmt.Printf("%+v", c)
}
代碼輸出如下:
{Basic:{R:1 G:1 B:0} Alpha:1}

對代碼的說明:
  • 第 8 行定義基礎顏色結構,包含 3 個顏色分量,分別是紅、綠、藍,范圍為 0~1。
  • 第 14 行定義了完整顏色結構,包含有基礎顏色和透明度。
  • 第 25 行,實例化一個完整顏色結構。
  • 第 28~30 行訪問基礎顏色并賦值。

第 28~30 行的代碼需要通過 Basic 結構才能設置 R、G、B 分量,雖然合理但是寫法很復雜。使用 Go 語言的結構體內嵌寫法重新調整代碼如下:
package main

import (
    "fmt"
)

type BasicColor struct {
    R, G, B float32
}

type Color struct {
    BasicColor
    Alpha float32
}

func main() {

    var c Color
    c.R = 1
    c.G = 1
    c.B = 0

    c.Alpha = 1

    fmt.Printf("%+v", c)
}
代碼加粗部分是經過調整及修改的代碼。代碼第 12 行中,將 BasicColor 結構體嵌入到 Color 結構體中,BasicColor 沒有字段名而只有類型,這種寫法就叫做結構體內嵌。

第 19~21 行中,可以直接對 Color 的 R、G、B 成員進行設置,編譯器通過 Color 的定義知道 R、G、B 成員來自 BasicColor 內嵌的結構體。

結構內嵌特性

Go語言的結構體內嵌有如下特性。

1) 內嵌的結構體可以直接訪問其成員變量

嵌入結構體的成員,可以通過外部結構體的實例直接訪問。如果結構體有多層嵌入結構體,結構體實例訪問任意一級的嵌入結構體成員時都只用給出字段名,而無須像傳統結構體字段一樣,通過一層層的結構體字段訪問到最終的字段。例如,ins.a.b.c的訪問可以簡化為ins.c。

2) 內嵌結構體的字段名是它的類型名

內嵌結構體字段仍然可以使用詳細的字段進行一層層訪問,內嵌結構體的字段名就是它的類型名,代碼如下:
var c Color
c.BasicColor.R = 1
c.BasicColor.G = 1
c.BasicColor.B = 0
一個結構體只能嵌入一個同類型的成員,無須擔心結構體重名和錯誤賦值的情況,編譯器在發現可能的賦值歧義時會報錯。

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

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

底部Logo