[TOC] # 结构体 ~~~ type Student struct { id int name string sex byte age int } ~~~ ## 初始化 ~~~ type Student struct { id int name string sex byte //字符类型 age int } func main() { //顺序初始化,每个成员必须初始化 var s1 Student = Student{1, "2", 'm', 18} fmt.Println(s1) //指定成员初始化,没有初始化的成员,自动赋值为0 student := Student{name: "mike", age: 19} fmt.Println(student) } ~~~ ## 结构体指针 ~~~ func main() { var s1 *Student = &Student{1, "2", 'm', 18} fmt.Println("*s1 = ", *s1) //指定成员初始化,没有初始化的成员,自动赋值为0 student := &Student{name: "mike", age: 19} //打印类型 fmt.Printf("student type %T\n", student) fmt.Println("*student = ", *student) } ~~~ 输出 ~~~ *s1 = {1 2 109 18} student type *main.Student *student = {0 mike 0 19} ~~~ ~~~ func main() { var s Student var p1 *Student p1 = &s //通过指针操作成员 p1.id和(*p1).id完全等价,只能使用. p1.id = 1 (*p1).name = "mike" p1.age = 11 fmt.Println(*p1) } ~~~ ## new申请空间 ~~~ func main() { p1 := new(Student) p1.id = 1 (*p1).name = "mike" p1.age = 11 fmt.Println(*p1) } ~~~ ## 结构体比较 如果结构体成员都是可比较的,那结构体也是可比较的,可以使用==或!=,但是不支持>或< ## 函数参数 **值传递不是引用** ~~~ func test01(s Student) { s.id = 666 fmt.Println("test01: ", s) } func main() { s := Student{1, "mike", 'x', 11} test01(s) fmt.Println("main: ", s) } ~~~ 输出 ~~~ test01: {666 mike 120 11} main: {1 mike 120 11} ~~~ ## 大小 unsafe.Sizeof ~~~ func main() { var p Power p.age = 11 p.name = "wfwef" fmt.Println(unsafe.Sizeof(p)) } ~~~ ## 内存地址 结构体的变量地址等于首个元素的内存地址 ## nil 空struct这么表示: ~~~ struct{}{} ~~~ 例子: ~~~ package main import "fmt" func main() { s := struct{}{} fmt.Printf("%T,%v,%+v\n", s, s, s) } ~~~ 输出 ~~~ struct {},{},{} ~~~ 大括号左右可以多个空格,比如这样也是可以的 ~~~ struct {} {} ~~~