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

初始化结构体的成员变量

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

  初始化有两种形态:

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

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

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

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
  
type People struct {
    name string
    child *People
}
 
relation := &Peolple{
    name: "爷爷",
    child: &People{
        name: "爸爸",
        child: &Peole{
            name: "我",
        },
    },
}

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
  
type Address struct{
    Province string
    City    string
    ZipCode int
    PhoneNumber string
}
 
add := Address{
    "四川",
    "成都",
    610000,
    "0",
}

三、初始化匿名结构体

  匿名结构体没有类型名称,无须通过 type 关键字就可以直接使用。

    1、匿名结构体定义格式和初始化写法

  匿名结构体的初始化写法由结构体定义和键值对初始化两部分组成。结构体定义时没有结构体类型名,只有字段和类型定义。键值对初始化部分由可选的多个键值对组成,如下格式所示:

1
2
3
4
5
6
7
8
9
10
11
ins := struct{
    //匿名结构体字段定义
    字段 1 字段类型1
    字段2  字段类型2
    ...
}{
    //字段值初始化
    初始化字段 1: 字段 1 的值,
    初始化字段 2: 字段 2 的值,
    ...
  • 字段1、字段2……:及饿哦固体定义的字段名。
  • 初始化字段1、初始化字段2……: 结构体初始化时的字段名,可选择性地对字段初始化。
  • 字段类型1、字段类型2……: 结构体定义字段的类型。
  • 字段1的值,字段2的值……:结构体初始化字段的初始值。

键值对初始化部分是可选的,不初始化成员时,匿名结构体的格式变为:

1
2
3
4
5
ins := struct{
    字段 1 字段类型 1
    字段 2 字段类型 2
    ...
}{}

2、使用匿名结构体的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 @   左扬  阅读(480)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
levels of contents
点击右上角即可分享
微信分享提示