Go-struct
程序员文章站
2022-07-10 08:21:34
...
结构体:将0个或多个任意类型的命名变量组合在一起的聚合数据类型。
如:
type Employee struct{
ID int
Name string
Address string
DoB time.Time
Position string
Salary int
ManagerId int
}
var dilbert Employee
//成员访问
dilbert.Salary -= 5000
//获取成员变量的地址,然后通过指针访问
position := &dilbert.Position
*position = "Senior" + *position
//点号作用在结构体指针上
var employeeOfTheMonth *Employee = &dilbert
employeeOfTheMonth.Position += "(proctive team player)"
聚合类型S不可以包含它自己,但S中可以定义一个S的指针类型,即*S,可以创建一些递归的数据类型,如:链表、树。
type tree struct{
value int
left,right *tree
}
func add(t *tree, value int) *tree{
if t == nil{
//等价于返回&tree{value,value}
t = new(tree)
t.value = value
return t
}
if value < t.value{
t.left = add(t,left, value)
}else{
t.right = add(t.right, value)
}
}
//将元素按顺序追加到values里面,然后返回slice
func appendValues(values []int, t *tree)[]int{
if t != nil{
values = appendValues(values, t.left)
values = append(values, t.vallue)
values = appendValues(values, t.right)
}
return values
}
结构体字面量的两种格式
(1)type Point struct{X,Y int} P := Point{1,2} //按成员变量正确顺序
(2)通过指定部分或全部成员变量的名称,如果某个成员变量没有指定,它的值是该成员变量的零值
P := Point{X:1}
如果结构体没有任何成员的话就是空结构体,写作struct{}。它的大小为0,也不包含任何信息,但是有时候依然是有价值的。有些Go语言程序员用map带模拟set数据结构时,用它来代替map中布尔类型的value,只是强调key的重要性,但是因为节约的空间有限,而且语法比较复杂,我们通常避免避免这样的用法。
seen := make(map[string]struct{}) // set of strings
// ...
if _, ok := seen[s]; !ok {
seen[s] = struct{}{}
// ...first time seeing s...
}
结构体可以作为函数的参数和返回值,如果结构体较大,一般使用指针参数,而且如果要在函数修改结构体,则必须使用指针形式。go语言中所有的函数参数都是值拷贝。
func Bonus( e *Employee, percent int) int{
return e.Salary * percent / 100
}
func AwardAnnualRaise (e *Employee){ //接收的是实参的副本
e.Salary = e.Salary * 105 / 100
}
pp := &Point{1, 2} <==> pp := new{Point} *pp = Point{1,2}
如果结构体的全部成员都是可比较的,则该结构体也可比较,则可作为Map的key类型。比较实用 == 或 !=
上一篇: 正则表达式基础语法例子
下一篇: C++结构体的各种用法
推荐阅读