package main
import "fmt"
// 1.定义一个书的结构体
type Book struct {
bookName string
price float64
}
// 2.定义学生的结构体
type Student struct {
name string
age int
book Book // 结构体嵌套
}
type Student2 struct {
name string
age int
book *Book // book的地址
}
func main() {
/*
结构体嵌套:一个结构体中的字段,是另一个结构体类型。
has a
*/
b1 := Book{}
b1.bookName = "西游记"
b1.price = 45.8
s1 := Student{}
s1.name = "王二狗"
s1.age = 18
s1.book = b1 // 值传递
fmt.Println(b1) // {西游记 45.8}
fmt.Println(s1) // {王二狗 18 {西游记 45.8}}
fmt.Printf("学生姓名:%s,学生年龄:%d,看的书是:《%s》,书的价格是:%.2f\n", s1.name, s1.age, s1.book.bookName, s1.book.price)
// 学生姓名:王二狗,学生年龄:18,看的书是:《西游记》,书的价格是:45.80
s1.book.bookName = "红楼梦"
fmt.Println(s1) // {王二狗 18 {红楼梦 45.8}}
fmt.Println(b1) // {西游记 45.8} 值传递,并未修改b1
b4 := Book{bookName: "呼啸山庄", price: 76.9}
s4 := Student2{name: "Ruby", age: 18, book: &b4}
fmt.Println(b4) // {呼啸山庄 76.9}
fmt.Println(s4) // {Ruby 18 0xc0000040a8}
fmt.Println("\t", s4.book) // &{呼啸山庄 76.9}
s4.book.bookName = "雾都孤儿"
fmt.Println(b4) // {雾都孤儿 76.9} 引用传递,修改了b4
fmt.Println(s4) // {Ruby 18 0xc0000040a8}
fmt.Println("\t", s4.book) // &{雾都孤儿 76.9}
s2 := Student{name: "李小花", age: 19, book: Book{bookName: "Go语言是怎样炼成的", price: 89.7}}
fmt.Println(s2.name, s2.age) // 李小花 19
fmt.Println("\t", s2.book.bookName, s2.book.price) // Go语言是怎样炼成的 89.7
s3 := Student{
name: "Jerry",
age: 17,
book: Book{
bookName: "十万个为啥",
price: 55.9,
},
}
fmt.Println(s3.name, s3.age) // Jerry 17
fmt.Println("\t", s3.book.bookName, s3.book.price) // 十万个为啥 55.9
}