package main

import "fmt"

type Book struct {
	title, author string
	pages         int
}

func main() {
	// {
	// 	//指针
	// p := new(int)
	// fmt.Println(p, *p)
	// b := 1
	// q := &b
	// fmt.Println(q, *q)
	// }

	// {
	// 	//结构体

	// 	book := Book{"Go语言101", "老貘", 256}
	// 	fmt.Println(book) // {Go语言101 老貘 256}

	// 	// 使用带字段名的组合字面量来表示结构体值。
	// 	book = Book{author: "老貘", pages: 256, title: "Go语言101"}
	// 	// title和author字段的值都为空字符串""，pages字段的值为0。
	// 	book = Book{}
	// 	// title字段空字符串""，pages字段为0。
	// 	book = Book{author: "老貘"}

	// 	// 使用选择器来访问和修改字段值。
	// 	var book2 Book // <=> book2 := Book{}
	// 	book2.author = "Tapir"
	// 	book2.pages = 300
	// 	fmt.Println(book2.pages) // 300

	// 	var _ = Book{
	// 		author: "老貘",
	// 		pages:  256,
	// 		title:  "Go语言101", // 这里行尾的逗号不可省略
	// 	}

	// }

	{
		//在字段选择器中，属主结构体值可以是指针，它将被隐式解引用
		type Book struct {
			pages int
		}
		book1 := &Book{100} // book1是一个指针
		book2 := new(Book)  // book2是另外一个指针 new 新建的是指针
		fmt.Println(book1, book2)
		// 像使用结构值一样来使用结构体值的指针。
		book2.pages = book1.pages
		fmt.Println(book1.pages == book2.pages)
		// 上一行等价于下一行。换句话说，上一行
		// 两个选择器中的指针属主将被自动解引用。
		(*book2).pages = (*book1).pages

	}

}
