复合类型 - 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"))
}