在 Go 语言中,结构体(struct)是一种用户自定义的数据类型,它可以包含多种不同类型的数据组合在一起。结构体为组织和管理相关数据提供了一种有效的方式,常用于表示现实世界中的对象或概念。如果你懂C/C++,那么这个数据结构理解起来挺容易的,只是形式上略有不同。
结构体定义
type <结构体名> struct {
<成员1> <类型1>
<成员2> <类型2>
<成员3> <类型3>
...
}
type
关键字:表示定义了一个新类型。- struct 关键字:表示新的类型是一个结构体类型
- 结构体可以包含多个成员,每个成员的类型可以相同也可以不同
- 成员命名也区分大小写,大驼峰命名外部包是否可以被引用
- 结构体可以有自己的成员函数(这里后续再补充)
- 成员函数也是要有大小写的命名,大驼峰命名外部包可以引用
- 作为函数形式参数的时候,通常是传递指针类型,因为结构体的内容可能会很大
- 另外,指针类型可以直接修改原始数据,把修改的结果带回来,所以使用的时候也要注意
- 还有一种特殊的用法,匿名结构
- 指针变量与普通变量在访问结构体成员的时候都使用 . 的方式访问 (与C语言不一样)
- 结构体支持嵌套使用,最常见的例子就是解析配置 JSON 和 Yaml 内容的时候
结构体的使用
package main
import "fmt"
type Student struct {
NumID int // 学号
Name string // 姓名
ClassID string // 班级
Birthday string // 生日
Age int // 年龄
Sex string // 性别
IsAccommodation bool // 是否住校 true 住校 false 不住
}
func (s *Student)StudentInfoPrint() {
fmt.Println("学号 :", s.NumID)
fmt.Println("姓名 :", s.Name)
fmt.Println("班级 :", s.ClassID)
fmt.Println("生日 :", s.Birthday)
fmt.Println("年龄 :", s.Age)
fmt.Println("性别 :", s.Sex)
fmt.Println("是否住校 :", s.IsAccommodation)
}
func main() {
stu1 := Student {1, "张三", "一年级", "2020-01-12", 6, "男", true}
fmt.Println("===== stu1 =====")
stu1.StudentInfoPrint()
var stu2 Student
fmt.Println("===== stu2 =====")
stu2.StudentInfoPrint()
stu3 := &Student{}
stu3.Name = "李四"
fmt.Println("===== stu3 =====")
stu3.StudentInfoPrint()
stu4 := &Student{
NumID: 4,
Name: "王五",
ClassID: "二年级",
Birthday: "2018-03-12",
Age: 7,
Sex: "男",
}
fmt.Println("===== stu4 =====")
stu4.StudentInfoPrint()
stu5 := new(Student)
stu5.NumID = 5
stu5.Name = "朱六"
stu5.Sex = "女"
fmt.Println("===== stu5 =====")
stu5.StudentInfoPrint()
fmt.Println("匿名结果体使用")
stu6 := struct {
name string
age int
}
stu6.name = "刘七"
stu6.age = 10
fmt.Println("===== stu6 =====")
fmt.Println("name : ", stu6.name)
fmt.Println("age : ", stu6.age)
}