结构体
2022-03-12 大约 2 分钟
Golang没有类(class),Go语言的结构体(struct)和其他编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现的OOP特性的。
# 引入
package main
import "fmt"
// Teacher 定义老师的结构体, 将老师中的各个属性,统一放入结构体中管理
type Teacher struct {
Name string
Age int
School string
}
func main() {
// 创建老师的结构体实例
var t Teacher
// 在未赋值时默认是零
fmt.Println(t) // { 0 }
t.Name = "小明"
t.Age = 20
t.School = "清华大学"
fmt.Println(t) // {小明 20 清华大学}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建方式
# 方式一
// Teacher 定义老师的结构体
type Teacher struct {
Name string
Age int
School string
}
func main() {
// 创建老师的结构体实例
var t Teacher
fmt.Println(t) // { 0 }
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 方式二
package main
import "fmt"
// Teacher 定义老师的结构体, 将老师中的各个属性,统一放入结构体中管理
type Teacher struct {
Name string
Age int
School string
}
func main() {
// 创建老师的结构体实例,并初始化
var t Teacher = Teacher{}
t.Name = "小明"
t.Age = 20
t.School = "清华大学"
fmt.Println(t) // {小明 20 清华大学}
// or
var t1 Teacher = Teacher{"小明", 20, "清华大学"}
fmt.Println(t1) // {小明 20 清华大学}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 方式三
返回的是结构体指针
package main
import "fmt"
// Teacher 定义老师的结构体, 将老师中的各个属性,统一放入结构体中管理
type Teacher struct {
Name string
Age int
School string
}
func main() {
// 创建老师的结构体实例,并初始化
var t *Teacher = new(Teacher)
// t是指针,指向一个地址,这个地址指向的对象就是Teacher
(*t).Name = "小明" // 通过指针取值
(*t).Age = 20
// 简写
t.School = "清华大学"
fmt.Println(*t) // {小明 20 清华大学}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 方式四
package main
import "fmt"
// Teacher 定义老师的结构体, 将老师中的各个属性,统一放入结构体中管理
type Teacher struct {
Name string
Age int
School string
}
func main() {
// 创建老师的结构体实例
var t *Teacher = &Teacher{}
(*t).Name = "小明"
(*t).Age = 20
// 简写
t.School = "清华大学"
fmt.Println(*t) // {小明 20 清华大学}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 结构体之间的转化
结构体是用户单独定义的类型和其它类型进行转换时需要有完全相同的字段(名字、个数、类型)
package main import "fmt" type Student struct { Age int } type Person struct { Age int } func main() { var s Student = Student{10} var p Person = Person{10} s = Student(p) fmt.Println(s) // {10} fmt.Println(p) // {10} }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转。
package main import "fmt" type Student struct { Age int } type Stu Student func main() { var s Student = Student{19} var p Stu = Stu{19} s = Student(p) fmt.Println(s) // {19} fmt.Println(p) // {19} }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17