一.基本介绍

Go语言可以通过自定义的方式形成新的类型,结构体就是这些类型中的一种复合类型,结构体是由零个或多个任意类型的值聚合成的实体,每个值都可以称为结构体的成员。(相当于 C# 的实体类)

结构体成员也可以称为“字段”,这些字段有以下特性:
1.字段拥有自己的类型和值;
2.字段名必须唯一;
3.字段的类型也可以是结构体,甚至是字段所在结构体的类型。

 

结构体的定义格式如下:

type 类型名 struct {
    字段1 字段1类型
    字段2 字段2类型
    …
}

类型名:标识自定义结构体的名称,在同一个包内不能重复。
struct{}:表示结构体类型,type 类型名 struct{}可以理解为将 struct{} 结构体定义为类型名的类型。
字段1、字段2……:表示结构体字段名,结构体中的字段名必须唯一。
字段1类型、字段2类型……:表示结构体各个字段的类型。

 

二.实例化形式

结构体本身是一种类型,可以像整型、字符串等类型一样,以 var 的方式声明结构体即可完成实例化。

var ins T

T 为结构体类型,ins 为结构体的实例。

如:

type Point struct {
    X int
    Y int
}
var p Point
p.X = 10
p.Y = 20

 

三.创建指针类型的结构体

可以使用 new 关键字对类型(包括结构体、整型、浮点数、字符串等)进行实例化,结构体在实例化后会形成指针类型的结构体

ins := new(T)

T 为类型,可以是结构体、整型、字符串等。
ins:T 类型被实例化后保存到 ins 变量中,ins 的类型为 *T,属于指针。

如:

type Player struct{
    Name string
    HealthPoint int
    MagicPoint int
}
tank := new(Player)
tank.Name = "Canon"
tank.HealthPoint = 300

 

四.取结构体的地址实例化

对结构体进行&取地址操作时,视为对该类型进行一次 new 的实例化操作

ins := &T{}

T 表示结构体类型
ins 为结构体的实例,类型为 *T,是指针类型。

如:

type Command struct {
    Name    string    // 指令名称
    Var     *int      // 指令绑定的变量
    Comment string    // 指令的注释
}
var version int = 1
cmd := &Command{}
cmd.Name = "version"
cmd.Var = &version
cmd.Comment = "show version"

取地址实例化是最广泛的一种结构体实例化方式,可以使用函数封装上面的初始化过程,代码如下

func newCommand(name string, varref *int, comment string) *Command {
    return &Command{
        Name:    name,
        Var:     varref,
        Comment: comment,
    }
}
cmd = newCommand(
    "version",
    &version,
    "show version",
)

 

四.初始化结构体的成员变量

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

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

 

2.多个值的列表初始化结构体

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

type Address struct {
    Province    string
    City        string
    ZipCode     int
    PhoneNumber string
}
addr := Address{
    "四川",
    "成都",
    610000,
    "0",
}

使用这种格式初始化时,需要注意:
a.必须初始化结构体的所有字段。
b.每一个初始值的填充顺序必须与字段在结构体中的声明顺序一致。
c.键值对与值列表的初始化形式不能混用。