如前文所述,Python中的kv数据结构只有dict字段一种类型。但是golang中除了上文提到过的map映射外,还有一种数据类型是struct结构体,它也算是被用来存储kv类型的数据。struct的value数据类型没有map那么严格,可以是任意数据类型。

package main

import "fmt"

// 定义结构体的中字段及类型
type Student struct {
Name string
Age int
}

func main() {
// 实例化结构体并为字段赋值
var s1 Student
s1.Name = "wgw"
s1.Age = 18

// 快捷赋值方式
s2 := Student{"wgw2", 20}

fmt.Println(s1.Name)
fmt.Println(s2.Age)

}

运行结果

% go run main.go 
wgw
20

结构体中的字段名称、数量、类型在声明的时候就已经确定,实例化阶段只能对字段进行赋值。不支持对字段的增删操作,这点与map完全不同。

把定义好的struct作为函数的参数使用

package main

import "fmt"

// 定义结构体的中字段类型
type Student struct {
Name string
Age int
}

func Info(s Student) (string, int) {
var msg string
if s.Age > 19 {
msg = "你超过19岁了哦"
} else {
msg = "你不到19岁哦"
}

return msg, s.Age
}

func main() {
// 实例化结构体并为字段赋值
var s1 Student
s1.Name = "wgw"
s1.Age = 18

s2 := Student{"wgw2", 20}

ret, age := Info(s1)
fmt.Println(ret, age)

fmt.Println("-----")

ret, age = Info(s2)
fmt.Println(ret, age)

}

运行结果

% go run main.go
你不到19岁哦 18
-----
你超过19岁了哦 20

结构体的操作就这么一点点,其实操作还是非常简单的。最后就是演示一下结构体的嵌套。在上文的结构体再嵌入一个声明宠物puppet信息的结构体(显式调用)。

package main

import "fmt"

// 定义结构体的中字段类型

type Puppet struct {
Name string
Animal string
}

type Student struct {
Name string
Age int
// 显式调用,明确的为字段声明一个名字 并注明数据类型是上面定义的结构体类型
Pupe Puppet
}

func Info(s Student) (string, int, string) {
var msg string
if s.Age > 19 {
msg = "你超过19岁了哦"
} else {
msg = "你不到19岁哦"
}

return msg, s.Age, s.Pupe.Animal
}

func main() {
// 实例化结构体并为字段赋值
var s1 Student
s1.Name = "wgw"
s1.Age = 18
s1.Pupe.Name = "haha"
s1.Pupe.Animal = "dog"

s2 := Student{"wgw2", 20, Puppet{"hoho", "cat"}}

ret, age, animal := Info(s1)
fmt.Println(ret, age, animal)

fmt.Println("-----")

ret, age, animal = Info(s2)
fmt.Println(ret, age)

}

运行结果

% go run main.go
你不到19岁哦 18 dog
-----
你超过19岁了哦 20 cat