结构体定义与赋值:

package main

import "fmt"

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

func main() {
	// 初始化并赋值,且每个元素都要赋值
	var s1 Student = Student{1, "aaa", 'm', 18, "bbbbbb"}
	fmt.Println(s1)

	// 指定成员赋值,其他的成员为0
	s2 := Student{name: "ddd", addr: "dedede"}
	fmt.Println(s2)
}

指针结构体:

package main

import "fmt"

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

func main() {
	// 定义个指针,值为取地址的结构体
	var s1 *Student = &Student{1, "aaa", 'm', 18, "bbbbbb"}
	fmt.Println(s1)

	s2 := &Student{name: "ddd", addr: "dedede"}
	fmt.Println(s2)
}

结构体的使用:

package main

import "fmt"

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

func main() {
	var s Student
	s.id = 1
	s.name = "hello"
	s.sex = 'm'
	s.age = 20
	s.addr = "hhhhhhh"
	fmt.Println(s)
}

指针结构体:

package main

import "fmt"

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

func main() {
	var s Student
	var p *Student
	p = &s

	// 通过指针操作成员,p.id 和 (*p).id
	p.id = 1
	(*p).name = "haha"
	p.sex = 'm'
	p.age = 18
	p.addr = "demo"
	fmt.Println(p)

	// 通过new()来申请指针结构体,new()返回的是一个内存地址
	p1 := new(Student)
	p1.name = "haha"
	p1.sex = 'm'
	p1.age = 18
	p1.addr = "demo"
	fmt.Println(p1)
}

结构体比较:

package main

import "fmt"

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

func main() {
	// 结构体比较
	var s1 Student = Student{1, "aaa", 'm', 18, "bbb"}
	var s2 Student = Student{1, "aaa", 'm', 18, "bbb"}
	var s3 Student = Student{1, "aaa", 'm', 18, "ccc"}
	fmt.Println(s1 == s2) // true
	fmt.Println(s2 == s3) // false

	// 相同结构体可以赋值
	var temp Student
	temp = s3
	fmt.Println(temp)
}

结构体做函数参数:值传递

package main

import "fmt"

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

func demo(s Student) {
	s.id = 666
	fmt.Println(s)
}

func main() {
	var s1 Student = Student{1, "aaa", 'm', 18, "bbb"}
	demo(s1)
	fmt.Println(s1)
}

结构体做函数参数:引用传递

package main

import "fmt"

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

// 形参指针
func demo(s *Student) {
	s.id = 666
	fmt.Println(s)
}

func main() {
	var s1 Student = Student{1, "aaa", 'm', 18, "bbb"}
	demo(&s1) // 引用传递,地址传递
	fmt.Println(s1)
}

可见性:结构体、函数名、类型名首字母必须要大写才能被其他包调用,如果首字母小写只能在同一个包中使用。