匿名字段初始化
package main
import "fmt"
type Person struct {
name string
sex byte
age int
}
type Student struct {
Person //只有类型 没有名字:匿名字段 继承了Person里面的成员
id int
addr string
}
func main() {
//顺序初始化
var s Student = Student{Person{"jack", 'n', 18}, 1, "shanghai"}
fmt.Println("s = ", s)
//自动推导类型
s1 := Student{Person{"koko", 'n', 18}, 2, "shanghai"}
fmt.Println("s1 = ", s1)
//%+v显示更详细的信息
fmt.Printf("s1 = %+v\n", s1)
//指定成员初始化,没有初始化的成员自动赋值为0
s2 := Student{id: 2}
fmt.Printf("s2 = %+v\n", s2)
s3 := Student{Person: Person{name: "lucas"}, id: 2}
fmt.Printf("s3 = %+v\n", s3)
}
成员操作
package main
import "fmt"
type Person struct {
name string
sex byte
age int
}
type Student struct {
Person //只有类型 没有名字:匿名字段 继承了Person里面的成员
id int
addr string
name string
}
func main() {
var s Student = Student{Person{"jack", 'n', 18}, 1, "shanghai", "koko"}
s.name = "lucas"
s.Person.age = 12
fmt.Println(s.addr, s.age, s.id, s.name, s.sex)
}
同名字段
package main
import "fmt"
type Person struct {
name string
sex byte
age int
}
type Student struct {
Person //只有类型 没有名字:匿名字段 继承了Person里面的成员
id int
addr string
name string
}
func main() {
var s Student
//默认规则(就近原则: 如果能在本作用域找到此成员,则操作此成员;如果没有找到,则找继承的字段)
s.name = "lucas"
s.Person.name = "koko"
fmt.Println(s.name, s.Person.name)
}
非结构体匿名字段
package main
import "fmt"
type mystr string //自定义类型
type Person struct {
name string
sex byte
age int
}
type Student struct {
Person //结构体匿名字段
int //基础类型的匿名字段
id int
mystr
}
func main() {
var s Student
s.int = 1
s.mystr = "gzd"
s.Person = Person{name: "fofo"}
fmt.Println("s = ", s)
fmt.Printf("s = %+v\n", s)
}
结构体指针类型的匿名字段
package main
import "fmt"
type Person struct {
name string
sex byte
age int
}
type Student struct {
*Person //指针类型
id int
}
func main() {
//指针取地址
s := Student{&Person{"koko", 'n', 12}, 1} //注意取地址符'&'
fmt.Println(s.name, s.age, s.id, s.sex)
//分配空间
var s1 Student
s1.Person = new(Person)
s1.name = "lucas"
fmt.Printf("s1 = %+v\n", s1)
fmt.Println(s1.name)
}