一个命名为s的结构体不能包含s类型的成员,但能包含*s指针类型的成员,这可以让我们创建递归的数据类型
空结构体的价值在map中体现的淋漓尽致,有时候我们需要设置set的数据结构:
set不包含键值对,而且每个值在set中都是唯一的,set的主要目的是知道这个元素是不是这个集合的一部分
set := make(map[string]struct{})
如果考虑效率的话,较大的结构体通常会用指针的方式传入和返回
如果要在函数内部修改结构体成员,用指针传入是必须的
func Award(e *Employee){
e.Salary = e.Salary*100
}
结构体之间的比较
如果结构体的成员是可以比较的,那么结构体也是可以直接比较的
type Point struct{
X,Y int
}
p:=Point{1,2}
q:=Point{2,1}
fmt.Println(p==q)
匿名结构体
type Circle struct{
Point
Radius int
}
type Point struct {
X, Y int
}
func main(){
var c Circle
c.X = 5//equivalent to c.Point.X = 5
//但是如果我们直接声明结构体字面量就会出现问题
c = Circle{2,2,4}//error:unknow fields
}
需要遵循以下的写法:
c = Circle{Point{1,2},2}
fmt.Printf("%#v\n",w)
//%v参数包含的#副词,表示用和Go语言类似的语法打印值
有些时候我们会嵌入匿名结构体的原因是此结构体中的方法我们可以使用