Go从入门到精通——结构体(struct)——初始化结构体的成员变量

初始化结构体的成员变量

  结构体在实例化时可以直接对成员变量进行初始化。

  初始化有两种形态:

    1、字段 "键值对" 形式及多个值的列表形式。(键值对形式的初始化适合选择性填充字段较多的结构体)

    2、多个值的列表形式适合填充字段较少的结构体。

一、使用“键值对”初始化结构体

  结构体可以使用“键值对”(key value pair)初始化字段,每个 "键"(key)对应结构体中的一个字段。键的“值”(value)对应字段需要初始化的值。

  键值对的填充是可选的,不需要初始化的字段可以不填入初始化列表中。

  结构体实例化后字段的默认值是字段类型的默认值,也就是零值。例如:数值为0,字符串Wie空字符串,布尔为 false,指正为 nil 等。

    1、键值对初始化结构体的书写格式

  键值对初始化的格式如下:

ins := 结构体类型名{
    字段1: 字段1的值,
    字段2: 字段2的值,
    ...
}

    2、使用键值对填充结构体的例子

  下面例子中描述了家里的人物关联。正如儿歌里唱的:“爸爸的爸爸是爷爷”,人物之间可以使用多级的 child 来描述和建立关联。使用键值对形式填充结构体的代码如下:

package main
 
type People struct {
    name string
    child *People
}

relation := &Peolple{
    name: "爷爷",
    child: &People{
        name: "爸爸",
        child: &Peole{
            name: "我",
        },
    },
}

二、使用多个值的列表初始化结构体

  Go 语言可以在 "键值对" 初始化的基础上忽略 "键"。也就是,可以使用多个值的列表初始化结构体的字段。

    1、多个值列表初始化结构体的书写格式

  多个值使用逗号分隔初始化结构体,例如:

ins := 结构体类型名{
    字段 1 的值,
    字段 2 的值,
    ...
}

  使用这种格式是初始化时,需要注意:

  • 必须初始化结构体的所有字段。
  • 每一个初始值的填充顺序必须与字段在结构体中声明顺序一致。
  • 键值对与值列表的初始化形式不能混用。

    2、多个值列表初始化结构体的例子

package main
 
type Address struct{
    Province string
    City    string
    ZipCode int
    PhoneNumber string
}

add := Address{
    "四川",
    "成都",
    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、使用匿名结构体的例子

package main
 
import "fmt"

//定义 printMsgType()函数,参数为 msg,类型为 *struct{id int data string}。
//因为没有使用type定义,所以需要在用到的地方每次进行定义。 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) }

  匿名结构体在使用时需要重新定义,造成大量的重复的代码,因此开发中较少使用。

posted @ 2022-05-29 23:04  左扬  阅读(465)  评论(0编辑  收藏  举报
levels of contents