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

Posted Locutus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 基础 — 高级数据类型 — 结构体:初始化结构体的成员变量相关的知识,希望对你有一定的参考价值。

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

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

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}

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

以上是关于go语言学习笔记 — 基础 — 高级数据类型 — 结构体:初始化结构体的成员变量的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组:一维数组

go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 切片:切片内部结构

go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组:向函数传递数组

go语言学习笔记 — 基础 — 高级数据类型 — 派生类型:指针(pointer)数据容器函数(func)结构体(struct)通道(channel)

go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 切片:数组 vs. 切⽚

go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 切片:切片的初始化声明