复合类型 - struct
定义
结构体是用户定义的类型,表示若干个字段(Field)的集合。类似面向对象语言中的类概念。
声明/使用方式
- 声明
- 全字段展开定义
 - 同类型字段合并定义
 - 匿名结构体
 
 - 使用
- 赋值指定Key
- ==无视顺序==
 
 - 不指定Key赋值
- 赋值时==依赖结构体声明时顺序==
 
 - 匿名结构体
 
 - 赋值指定Key
 
// 声明方式
// 1 全字段 展开形式
type Person struct {
	name string
	age int
	sex string
}
// 2 类型相同字段合并
type Person struct {
	name,sex string
	age int
}
// 3.匿名结构体
var person struct {
	name,sex string
	age int
}
// 结构体 struct 使用
// 指定Key赋值 - 优点无视顺序
person2 := Person{
	name: "nihao",
	sex: "male",
	age: 10,
}
fmt.Printf("%v \n", person2) // {nihao male 10} 
person3 := Person{"hehe", "female", 12}
fmt.Printf("%v \n", person3) // {hehe female 12} 
person4 := struct {
    name, sex string
    age int
}{
    name: "Andreah",
    sex:  "male",
    age:       31
}
fmt.Printf("%v", person4) // {Andreah male 31}
用法
集合 - 声明为map[string]struct{}
- struct{}为空,不占用内存空间
 - 通过_,ok := map["key"]判断Key是否存在,ok为true则表示存在
 
// 如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
func containsDup(nums []int) bool {
	dup := make(map[int]struct{})
	for _,v := range nums {
		if _,ok := dup[v]; ok == true {
			return true
		}
		dup[v] = struct{}{}
	}
	return false
}
func main() {
	nums := []int{1,2,2,3,4}
	dup := containsDup(nums)
	fmt.Printf("%b", dup) // true
}
作为通道的值
- 主要利用的是struct{}不占用内存空间,通道赋值时减少内存开销
 
/**
 * 1对1 通知
 * 创建阻塞 chan
 *
 */
type signal struct {
}
func worker() {
	println("worker is working")
	time.Sleep(2 * time.Second)
}
func spawn(f func()) chan signal {
	c := make(chan signal)
	go func() {
		println("start worker")
		f()
		c <- signal{}
	}()
	return c
}
func main2() {
	println(time.Now().Format("2006-01-02 15:04:05"))
	c := spawn(worker)
	<-c
	println(time.Now().Format("2006-01-02 15:04:05"))
}