9.10Go之结构体之初始化结构体成员变量

9.10Go之结构体之初始化结构体成员变量

成员变量初始化特点

  • 结构体初始化时可以直接对成员变量进行初始化

形式:

  • 键值对的形式(key value pair)

  • 键值对形式的初始化适合选择性填充字段较多的结构体

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

初始化结构体格式

  • 使用"键值对"初始化结构体

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

  • 初始化匿名结构体


使用"键值对"初始化结构体

特点:

  • 每个“键”(Key)对应结构体中的一个字段,键的“值”(Value)对应字段需要初始化的值

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

  • 结构体实例化后字段的默认值是字段类型的默认值--->因为结构体可以是基本类型的复合类型

使用键值对初始化结构体的格式:

ins := 结构体类型名{
   字段1: 字段1的值,
   字段2: 字段2的值,
   
}
  • 结构体类型:定义结构体时的类型名称。

  • 字段1、字段2:结构体成员的字段名,结构体类型名的字段初始化列表中,字段名只能出现一次。

  • 字段1的值、字段2的值:结构体成员字段的初始值。

键值之间以:分隔,键值对之间以,分隔

使用键值对填充结构体的实例:

需求:

  • 写一个人物关系结构体

  • 法德的法德是格瑞法德

  • 法德的桑是自己

package main

import "fmt"

/*
写一个People结构体
两个成员:
1、name
2、指向自己
*/
type People struct {
Name string
Child *People
}

func main() {
//初始化结构体的成员
relation := &People{
Name: "外祖父",
Child: &People{
Name: "父亲",
Child: &People{
Name: "自己",
/*
因为需要初始化的结构体成员可以自定义,所以可以套娃
*/
},
},
}
fmt.Println(relation)
}

结构体成员中只能包含结构体的指针类型,包含非指针类型会引起编译错误

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

特点:

  • 在“键值对”初始化的基础上忽略“键”,使用多个值的列表初始化结构体的字段

使用多个值列表初始化结构体的格式:

ins := 结构体类型名{
   字段1的值,
   字段2的值,
   
}
  • 必须初始化结构体的所有字段。

  • 每一个初始值的填充顺序必须与字段在结构体中的声明顺序一致。

  • 键值对与值列表的初始化形式不能混用。

使用多值列表初始化结构体的代码示例:

需求:

  • 创建一个地址结构体

  • 包含省份、城市、邮编等成员

  • 使用多值列表对其进行初始化

package main

import "fmt"

/*
创建一个省份结构体
*/
type Address struct {
Province string
City string
Code int64
}

func main() {
address := Address{
"广西",
"柳州",
545001,
}
fmt.Println(address)
}

初始化匿名结构体

特点:

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

匿名结构体格式:

ins := struct {
   // 匿名结构体字段定义
   字段1 字段类型1
   字段2 字段类型2
   
}{
   // 字段值初始化
   初始化字段1: 字段1的值,
   初始化字段2: 字段2的值,
   
}
  • 字段1、字段2:结构体定义的字段名。

  • 初始化字段1、初始化字段2:结构体初始化时的字段名,可选择性地对字段初始化。

    • 初始化字段是可选的,不初始化的成员结构:

    • ins := struct {
         字段1 字段类型1
         字段2 字段类型2
         
      }
  • 字段类型1、字段类型2:结构体定义字段的类型。

  • 字段1的值、字段2的值:结构体初始化字段的初始值。

使用匿名结构体的示例代码:

需求:

  • 创建一个信息匿名结构体

  • 打印结构体内容

package main

import "fmt"

/*
创建一个创建匿名结构体并且打印的函数
使用字符串格式化中的%T动词,将 msg 的类型名打印出来
*/
func printMes(mes *struct{ id int; data string }) {
fmt.Printf("%T\n", mes)
}

func main() {
//实例化匿名结构体
msg := &struct {
//定义成员部分
id int
data string
}{
//初始化值
1024,
"Hello",
}

//调用打印方法
printMes(msg)
}

 

posted @ 2021-09-10 19:49  俊king  阅读(172)  评论(0编辑  收藏  举报