结构体是一系列具有指定数据类型的数据字段,它能够让您通过单个变量引用一系列相关的值。通过使用结构体,可在单个变量中存储多种类型不同的数据字段。存储在结构体中的值可轻松地访问和修改,提供了一种灵活的数据结构创建方式。

import "fmt"
type Gril struct {
Name string
Age int
}
func main() {
g := Gril{
Name:"lili",
Age:11,
}
fmt.Println(g.Name,g.Age)
}

定义结构体类型名为Gril,里面有2个属性Name和Age,定义一个变量g,赋予2个属性值,然后就可以使用变量加点的方式访问属性了。也可以先定义变量,然后再对属性进行赋值,通过%+v的方式输出结构体的值

import "fmt"
type Gril struct {
Name string
Age int
}
func main() {
var g Gril
g.Name = "lili"
g.Age = 11
fmt.Printf("%+v\n",g)
}

也可以使用关键字new来创建结构体变量。

g :=new(Gril)
g.Name = "lili"
g.Age = 11
fmt.Printf("%+v\n",g)

结构体类型中的属性也可以是结构体,也就是结构体可以嵌套。

import "fmt"
type Gril struct {
Name string
Age int
Address Address
}

type Address struct {
City string
}
func main() {
g := Gril{
Name:"lili",
Age:11,
Address: Address {
City:"zz",
},
}
fmt.Printf("%+v\n",g)
}

输出

{Name:lili Age:11 Address:{City:zz}}

要访问内嵌结构体的数据字段,可以使用变量名加点加内嵌数据字段名。例如

g.Address.City

比较结构体的2个实例使用==

func main() {
g := Gril{
Name:"lili",
Age:11,
Address: Address {
City:"zz",
},
}
m :=Gril{
Name:"lili",
Age:11,
Address: Address {
City:"zz",
},
}
fmt.Println(g == m)
}

要导出结构体及其字段,结构体及其宇段的名称都必须以大写字母打头。

创建结构体实例时,给数据字段分配内存并给它们指定默认值,然后返回指向内存的指针,并将其赋给一个变量。复制结构体时,明确内存方面的差别很重要,指向结构体的变量赋给另一个变量时,被称为赋值。

func main() {
g := Gril{
Name:"lili",
Age:11,
Address: Address {
City:"zz",
},
}
m := g
m.Address.City = "cc"
fmt.Println(g)
fmt.Println(m)
}

结果

{lili 11 {zz}}
{lili 11 {cc}}

修改m的内容并不会影响g实例。要修改原始结构体实例的值,必须使用指针。指针是指向内存地址的引用,因此使用它操作的不是结构体的副本而是其本身。要想获得指针,在变量名前加上&。

func main() {
g := Gril{
Name:"lili",
Age:11,
Address: Address {
City:"zz",
},
}
m := &g
m.Address.City = "cc"
fmt.Println(g)
fmt.Println(*m)
}

输出

{lili 11 {cc}}
{lili 11 {cc}}

由于m是指针,所以需要使用*m来获得引用。