package main

import "fmt"

func main() {

	// slice 类型的初始化
	arr := []int{1, 2, 3}
	fmt.Println(arr)

	// map类型的初始化
	m1 := map[string]int{
		"张三": 18,
		"李四": 20,
	}
	fmt.Println(m1)

	// person 结构体类型的初始化
	p1 := Person{
		Name:   "张三",
		age:    18,
		Gender: GenderMale,
		Weight: 150,
		FavoriteColor: []string{
			"红色",
			"绿色",
		},
	}
	fmt.Println(p1)

	p2 := Person{
		Name:   "李四",
		age:    20,
		Gender: GenderFemale,
		Weight: 120,
		FavoriteColor: []string{
			"蓝色",
			"黑色",
		},
	}
	// p3 := Person{}
	// p3 := new(Person)
	fmt.Println(p2)

	// 访问结构体字段
	fmt.Println(p2.age)
	// 修改结构体字段
	p2.age = 22
	fmt.Println(p2.age)

	ChangePersonAge(&p2, 30)
	fmt.Println("ChangePersonAge", p2.age)
}

// Person 是一个表示人的结构体，包含姓名、年龄、性别、体重和喜欢的颜色等字段。
// 也是一个复合数据类型。
type Person struct {
	Name string
	// 不对外暴露的字段
	age           int
	Gender        Gender
	Weight        uint
	FavoriteColor []string
}

// GenderXXX 表示枚举值
// Gender 是一种自定义类型，底层类型是 int
// Gender != int
type Gender int

// Sex == Gender
type Sex = Gender

const (
	GenderMale Gender = iota
	GenderFemale
)

// ChangePersonAge 修改Person的年龄
func ChangePersonAge(p *Person, newAge int) {
	// 自动解开引用(*p)
	// * -> 解引用(Unbox)
	// (*p).age = newAge
	// p 指针类型， 自动解引用
	// . 访问字段
	// 自动解引用
	// p.age == (*p).age
	// 所以可以直接写成下面这样
	p.age = newAge
}

// func ChangeAge(age *int, newAge int) {
// 	*age = newAge
// }
