结构体
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  {} {}