C語言中文網 目錄

Go語言初始化結構體的成員變量

結構體在實例化時可以直接對成員變量進行初始化。初始化有兩種形式:一種是字段“鍵值對”形式及多個值的列表形式。鍵值對形式的初始化適合選擇性填充字段較多的結構體;多個值的列表形式適合填充字段較少的結構體。

使用“鍵值對”初始化結構體

結構體可以使用“鍵值對”(Key value pair)初始化字段,每個“鍵”(Key)對應結構體中的一個字段。鍵的“值”(Value)對應字段需要初始化的值。

鍵值對的填充是可選的,不需要初始化的字段可以不填入初始化列表中。

結構體實例化后字段的默認值是字段類型的默認值,例如:數值為 0,字符串為空字符串,布爾為 false,指針為 nil 等。

1) 鍵值對初始化結構體的書寫格式

鍵值對初始化的格式如下:

ins := 結構體類型名{
    字段1: 字段1的值,
    字段2: 字段2的值,
    …
}

下面是對各個部分的說明:
  • 結構體類型:定義結構體時的類型名稱。
  • 字段1、字段2:結構體的成員字段名。結構體類型名的字段初始化列表中,字段名只能出現一次。
  • 字段1的值、字段2的值:結構體成員字段的初始值。

鍵值之間以:分隔;鍵值對之間以,分隔。

2) 使用鍵值對填充結構體的例子

下面例子中描述了家里的人物關聯。正如兒歌里唱的:“爸爸的爸爸是爺爺”,人物之間可以使用多級的 child 來描述和建立關聯。使用鍵值對形式填充結構體的代碼如下:
type People struct {
    name  string
    child *People
}

relation := &People{
    name: "爺爺",
    child: &People{
        name: "爸爸",
        child: &People{
                name: "我",
        },
    },
}
代碼說明如下:
  • 第 1 行,定義 People 結構體。
  • 第 2 行,結構體的字符串字段。
  • 第 3 行,結構體的結構體指針字段,類型是 *People。
  • 第 6 行,relation 由 People 類型取地址后,形成類型為 *People 的實例。
  • 第 8 行,child 在初始化時,需要 *People 類型的值。使用取地址初始化一個 People。

結構體成員中只能包含結構體的指針類型,包含非指針類型會引起編譯錯誤。

使用多個值的列表初始化結構體

Go語言可以在“鍵值對”初始化的基礎上忽略“鍵”。也就是說,可以使用多個值的列表初始化結構體的字段。

1) 多個值列表初始化結構體的書寫格式

多個值使用逗號分隔初始化結構體,例如:

ins := 結構體類型名{
    字段1的值,
    字段2的值,
    …
}

使用這種格式初始化時,需要注意:
  • 必須初始化結構體的所有字段。
  • 每一個初始值的填充順序必須與字段在結構體中的聲明順序一致。
  • 鍵值對與值列表的初始化形式不能混用。

2) 多個值列表初始化結構體的例子

下面的例子描述了一段地址結構。地址要求具有一定的順序。例如:
type Address struct {
    Province    string
    City        string
    ZipCode     int
    PhoneNumber string
}

addr := Address{
    "四川",
    "成都",
    610000,
    "0",
}

fmt.Println(addr)
運行代碼,輸出如下:
{四川 成都 610000 0}

初始化匿名結構體

匿名結構體沒有類型名稱,無須通過type關鍵字定義就可以直接使用。

1) 匿名結構體定義格式和初始化寫法

匿名結構體的初始化寫法由結構體定義和鍵值對初始化兩部分組成。結構體定義時沒有結構體類型名,只有字段和類型定義。鍵值對初始化部分由可選的多個鍵值對組成,如下格式所示:

ins := struct {
    // 匿名結構體字段定義
    字段1 字段類型1
    字段2 字段類型2
    …
}{
    // 字段值初始化
    初始化字段1: 字段1的值,
    初始化字段2: 字段2的值,
    …
}

下面是對各個部分的說明:
  • 字段1、字段2……:結構體定義的字段名。
  • 初始化字段1、初始化字段2……:結構體初始化時的字段名,可選擇性地對字段初始化。
  • 字段類型1、字段類型2……:結構體定義字段的類型。
  • 字段1的值、字段2的值……:結構體初始化字段的初始值。

鍵值對初始化部分是可選的,不初始化成員時,匿名結構體的格式變為:

ins := struct {
    字段1字段類型1
    字段2字段類型2
    …
}

2) 使用匿名結構體的例子

在本例中,使用匿名結構體的方式定義和初始化一個消息結構,這個消息結構具有消息標示部分(ID)和數據部分(data)。打印消息內容的 printMsg() 函數在接收匿名結構體時需要在參數上重新定義匿名結構體,代碼如下:
package main

import (
    "fmt"
)

// 打印消息類型, 傳入匿名結構體
func printMsgType(msg *struct {
    id   int
    data string
}) {

    // 使用動詞%T打印msg的類型
    fmt.Printf("%T\n", msg)
}

func main() {

    // 實例化一個匿名結構體
    msg := &struct {  // 定義部分
        id   int
        data string
    }{  // 值初始化部分
        1024,
        "hello",
    }

    printMsgType(msg)
}
代碼輸出如下:
*struct { id int; data string }

代碼說明如下:
  • 第 8 行,定義 printMsgType() 函數,參數為 msg,類型為 *struct{id int data string}。因為類型沒有使用 type 定義,所以需要在用到的地方每次進行定義。
  • 第 14 行,使用字符串格式化中的%T動詞,將 msg 的類型名打印出來。
  • 第 20 行,對匿名結構體進行實例化,同時初始化成員。
  • 第 21 和 22 行,定義匿名結構體的字段。
  • 第 24 和 25 行,給匿名結構體字段賦予初始值。
  • 第 28 行,將 msg 傳入 printMsgType() 函數中進行函數調用。

匿名結構體的類型名是結構體包含字段成員的詳細描述。匿名結構體在使用時需要重新定義,造成大量重復的代碼,因此開發中較少使用。

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

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

底部Logo