73_Go基础_1_40 结构体嵌套与传值

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
}