go语言学习笔记 — 基础 — 高级数据类型 — 结构体(3):初始化结构体的成员变量

在实例化结构体时,我们可以直接初始化结构体成员变量。有两种形式:

  • 字段键值对及字段值的多个列表形式,适合选择性填充字段较多的结构体
  • 多个值列表的形式,适合填充字段较少的结构体

1. 使用“键值对”初始化结构体成员变量(键值对)

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

结构体实例化后字段默认值是对应类型零值,如int为0,bool为false,string为空字符串,指针为nil。

  • 格式
变量ins := 结构体类型名{
    字段1: 字段1的值,
    字段2: 字段2的值,
    ...
}

注意:键值之间以:分隔;键值对之间以,分隔。结构体成员变量字段不能重名。

  • 使用“键值对”填充结构体

家庭人物关系,人物之间关系可以使用多重child描述。

// 定义结构体People(或者叫People类型)
type People struct{
    name string
    child *People  // 成员变量字段child,值是结构体指针类型*People
}

// 取People类型的内存地址,形成结构体实例relation,为*People结构体指针类型
relation := &People{
    name : "爷爷",
    child : &People{   // 使用&取地址实例化一个People,{}初始化成员变量
        name : "爸爸",
        child: &People{
            name: "我",
        }
    }
}

结构体成员变量,只能包含同一结构体的指针类型。如果还有非指针的同类型,会报编译错误。


2. 使用多个值的列表初始化结构体(值列表)

在键值对初始化基础上,忽略“键”,我们可以使用多个值列表形式初始化结构体。

  • 格式
变量ins := 结构体类型名{
    字段1的值,
    字段2的值,
    ...
}

注意:必须初始化结构体所有字段。

不能混用键值对和值列表的结构体初始化方式。

每一个初始值填充顺序与成员变量字段在结构体声明顺序一致。

  • 多个值列表的形式初始化结构体

描述一段地址结构,具有一定的顺序。

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

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

fmt.Println(addr)

// {四川 成都 610000 0}

3. 定义匿名结构体,并初始化成员变量字段(少用)

匿名结构体没有类型名称,无须通过关键字type定义,直接使用。由匿名结构体定义和键值对初始化成员变量两部分组成。

  • 格式
ins := struct{
    字段1 字段类型1
    字段2 字段类型2
    字段3 字段类型3
    ...
}{
    // 键值对初始化结构体成员变量,可选择性对字段初始化
    字段1: 字段1的值,
    字段2: 字段2的值,
    ...
}

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

ins := struct {
    字段1 字段类型1
    字段2 字段类型2
    ...
}{}
  • 例子
package main

import (
    "fmt"
)

// 打印消息类型,入参为匿名结构体
func printMsgType(msg *struct { 
    id int        // 定义匿名结构体
    data string
}) {              // 函数体
    fmt.Printf("%T\n", msg) // 使用动词%T,打印msg的类型
    fmt.Println(msg)
}

func main() {
    msg := &struct { // 使用&取地址实例化,得*struct指针类型变量
        id int
        data string
    }{
        1024,        // 值列表初始化成员变量
        "hello",
    }
    
    printMsgType(msg) // 把msg变量传入printMsgType函数
}

// *struct { id int; data string }
// &{1024 hello}

匿名结构体的类型名,是结构体包含成员变量字段的详细描述。每次使用匿名结构体都要定义,造成重复代码,尽量少用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值