Golang结构的使用
Go中的结构体与C语言的结构体相似,可以包括多种数据类型。但也增加了一些新的特性,便于开发人员的使用。
type Animal struct {
name string
age int
son *Animal
}
注意:
- Go语言中使用首字母的大小写来 控制访问,结构体中同样如此,小写的变量包外不可导出。
- 结构体中可以使用 *Animal 的形式定义一个指针类型来实现链表和树的数据结构,与C语言类似。
- 两个struct如果其成员变量相同但顺序不同也视为不同的struct。
- 若结构体的所有成员变量是可比较的,则该结构体是可比较的。
1、结构体嵌套和匿名成员变量
结构体的嵌套是指将一个结构体作为另一个结构体的成员变量嵌套在其中,复用共同的地方。匿名成员变量则是指不给变量命名,调用时直接调用最上层的成员变量。
e.g.
package main
import (
"fmt"
)
type animal struct {
name string
age int
}
type cat struct {
//嵌套的匿名成员变量
animal
speed float64
}
type bird struct {
animal
weight float64
}
type eagle struct {
bird
flyHeight float64
}
func main() {
//对嵌套成员变量的初始化,必须加上name
a := cat{animal{"coco", 3}, 30}
b := eagle{bird{animal{"KK", 4}, 20}, 2000}
fmt.Println(a)
fmt.Println(b)
//‘#’表示
fmt.Printf("%#v\n", a)
fmt.Printf("%#v\n", b)
fmt.Println(b.age)
}
//输出
// {{coco 3} 30}
// {{{KK 4} 20} 2000}
// main.cat{animal:main.animal{name:"coco", age:3}, speed:30}
// main.eagle{bird:main.bird{animal:main.animal{name:"KK", age:4}, weight:20}, flyHeight:2000}
// 4
2、结构体实现树形数据结构
例子中使用结构体构造了一个二叉树,实现插入排序,首先生成一个排序二叉树,再按照left、mid、left的顺序进行排序。
package main
import "fmt"
type tree struct {
val int
l, r *tree
}
func main() {
num := []int{9, 8, 7, 6, 5, 4, 3}
num = sortTree(num)
fmt.Println(num)
}
func sortTree(num []int) []int {
var root *tree
for _, v := range num {
root = add(root, v)
}
num = num[:0]
num = lmrFind(root, num)
return num
}
//插入二叉树
func add(t *tree, val int) *tree {
if t == nil {
t = new(tree)
t.val = val
return t
}
if t.val > val {
t.l = add(t.l, val)
} else {
t.r = add(t.r, val)
}
return t
}
//遍历二叉树
func lmrFind(t *tree, num []int) []int {
if t != nil {
num = lmrFind(t.l, num)
num = append(num, t.val)
num = lmrFind(t.r, num)
}
return num
}