定义
值类型,赋值和传参会复制全部内容。可用”_”定义补位字段,支持指向自身类型的指针成员
package main
import "fmt"
type Node struct {
_ int
id int
data *byte
next *Node
}
func main() {
n1 := Node{
id : 1,
data: nil,
}
n2 := Node{
id : 2,
data: nil,
next: &n1,
}
fmt.Println(n1, n2)
}
顺序初始化必须包含全部字段,否则会出错
package main
import "fmt"
type User struct {
name string
age int
}
func main() {
u1 := User{"Tom", 20}
//u2 := User{"Tom"} //会报错,缺少字段
fmt.Println(u1)
}
支持匿名结构,可用作结构成员或定义变量
package main
import "fmt"
type File struct {
name string
size int
attr struct {
perm int
owner int
}
}
func main() {
f := File{
name : "test.txt",
size : 1024,
//attr : {0755,1} //这样赋值会报错
}
f.attr.owner = 1
f.attr.perm = 0755
fmt.Println(f)
d := File{
name : "a.txt",
size : 512,
}
var attr = struct {
perm int
owner int
}{2, 0755}
d.attr = attr
fmt.Println(d)
}
注意m的赋值方式
package main
import "fmt"
type User struct {
id int
name string
}
func main() {
m := map[User]int{
User{1, "Tom"} : 100,
}
fmt.Println(m) //100
}
匿名字段,其实是一种语法糖,就是一个与成员类型同名的字段,被匿名嵌入的可以使任何类型,当然也包括指针。可以像普通字段那样访问匿名字段成员,编译器从外向内逐级查找所有层次的匿名字段,知道发现目标或出错
package main
import "fmt"
type Resource struct {
id int
}
type Manager struct {
User
title string
}
type User struct {
Resource //匿名字段,相当于引用上面的Resource结构
name string
}
func main() {
var m Manager
m.id = 1
m.name = "Jack"
m.title = "Admin"
fmt.Println(m) //{{{1} Jack} Admin}
}
外层同名字段会遮蔽嵌入字段成员,相同层次的同名字段也会让编译器无所适从,解决方法是使用显示字段名
package main
import "fmt"
type Resource struct {
id int
name string
}
type Classify struct {
id int
}
type User struct {
Resource
Classify
name string
}
func main() {
u := User{
Resource{1, "pepple"},
Classify{100},
"Jack",
}
fmt.Println(u)
fmt.Println(u.name)
fmt.Println(u.Resource.id)
fmt.Println(u.Classify.id)
}