package main

import "fmt"

//结构体定义在函数外部
//定义函数类型
//type  functye func(int,int)int

//type 结构体名 struct {
//	结构体成员列表
//	成员名 数据类型
//	姓名 string
//	age int
//}

//结构体是全局的可以在项目所有文件使用
//结构体是一种数据类型
type student struct {
	id    int
	name  string
	age   int
	sex   string
	score int
	addr  string
}

func main0901() {

	//定义结构体变量 复合类型
	//var 变量名 结构体名
	//var stu student
	//
	////为结构体成员赋值 包名.函数名 结构体.成员  对象.方法
	//stu.name = "张大帅"
	//stu.score = 99
	//stu.addr = "奉天皇姑"
	//stu.sex = "男"
	//stu.age = 58
	//stu.id = 1

	//定义结构体是为成员赋值
	//var stu student = student{1, "张宗昌", 49, "男", 5, "山东济南"}
	//自动推导类型和指定成员赋值
	stu := student{name: "孙殿英", score: 60, sex: "男", addr: "北平", id: 1, age: 42}
	fmt.Println(stu)
}
func main0902() {
	stu := student{101, "朱德", 60, "男", 101, "四川"}

	fmt.Printf("%p\n", &stu)
	fmt.Printf("%p\n", &stu.id)
	//结构体成员为string 需要和结构体最大的数据类型进行对齐
	fmt.Printf("%p\n", &stu.name)
	fmt.Printf("%p\n", &stu.age)
	fmt.Printf("%p\n", &stu.sex)
	fmt.Printf("%p\n", &stu.score)
	fmt.Printf("%p\n", &stu.addr)
}

func main() {
	stu := student{102, "聂荣臻", 60, "男", 101, "湖南"}

	//将结构体变量赋值
	stu1 := stu
	stu1.id = 103
	//
	//fmt.Println(stu1)
	//fmt.Println(stu)

	//两个结构体比较 是比较所有成员 如果成员相同 结果为真  支持== !=比较操作
	if stu1 == stu {
		fmt.Println("相同")
	} else {
		fmt.Println("不相同")
	}

}
package main

import "fmt"

type Student struct {
	id    int
	name  string
	age   int
	sex   string
	score int
	addr  string
}

//结构体数组作为函数参数
func Sort(arr []Student) {

	for i := 0; i < len(arr)-1; i++ {
		for j := 0; j < len(arr)-1-i; j++ {
			//比较结构体成员信息
			if arr[j].age > arr[j+1].age {
				//交换数组元素
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}

	//fmt.Println(arr)
}
func main() {

	//结构体数组 |  切片
	var arr []Student = []Student{
		Student{101, "唐三藏", 32, "男", 100, "东土大唐"},
		Student{102, "孙悟空", 532, "男", 100, "花果山"},
		Student{103, "猪悟能", 600, "男", 100, "高老庄"},
		Student{104, "沙悟净", 180, "男", 100, "流沙河"},
		Student{105, "白龙马", 10, "男", 100, "西海"}}

	//fmt.Println(arr)

	//打印结构体信息
	//for i := 0; i < len(arr); i++ {
	//	fmt.Println(arr[i])
	//}
	//修改指定结构体成员的信息
	//arr[1].score = 60
	//arr[2].score = 10
	//fmt.Println(arr)

	//结构体切片添加数据
	arr = append(arr, Student{106, "如来大魔王", 9999, "男", 100, "西天"})

	//结构体数组作为函数参数是值传递
	//结构体切片作为函数参数是地址传递(引用传递)
	Sort(arr)
	fmt.Println(arr)
}