Go-基础回顾-复合数据类型-Struct

95 阅读2分钟

复合类型 - struct

定义

结构体是用户定义的类型,表示若干个字段(Field)的集合。类似面向对象语言中的类概念。

声明/使用方式

  • 声明
    • 全字段展开定义
    • 同类型字段合并定义
    • 匿名结构体
  • 使用
    • 赋值指定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"))
}

面向对象 - 待续