Go语言结构体
- struct里面可以包含多个字段(属性)
- struct类型可以定义方法,注意和函数的区分
- struct类型是值类型
- struct类型可以嵌套
- struct中的所有字段在内存是连续的
- 结构体是用户单独定义的类型,不能和其他类型进行强制转换
- struct没有构造函数,一般可以使用工厂模式来解决这个问题
- 工厂模式也就是定义一个全局函数,传入一些参数,返回一个结构体
- 结构体中字段可以没有名字,即匿名字段
- 此时如果匿名字段是一个结构,即讲解实现了继承
- struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string `json:"student_name"`
Age int `json:"age"`
Score int `json:"score"`
}
func main() {
var stu Student = Student{
Name: "stu01",
Age: 18,
Score: 80,
}
// 把这个结构体打包
data, err := json.Marshal(stu)
if err != nil {
fmt.Println("json encode stu failed, err:", err)
return
}
fmt.Println(string(data))
}
输出:(输出的字段变为tag字段了)
{“student_name”:“stu01”,“age”:18,“score”:80}
- 初始化
var stu Student
var stu *Student = new (Student)
var stu *Student = &Student{}
type Student struct{
Name string
Age int
score float32 //同样有大小写
}
func main() {
var stu Student
stu.Age = 18
stu.Name = "周杰伦"
stu.score = 80
var stu1 *Student = &Student{
Age:20,
Name:"林俊杰",
}
var stu2 =Student{
Age:20,
Name:"xxx",
}
fmt.Println(stu)
fmt.Println(stu1)
fmt.Println(stu2)
}
- 方法:Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以
有方法,而不仅仅是struct
func (recevier type) methodName(参数列表)(返回值列表){}
type A struct {
a int
}
func (t A) test() {
fmt.Println(t.a)
}
var t A
t.test()
- 方法和函数的区别
函数调用: function(variable, 参数列表)
方法:variable.function(参数列表)
-
如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个
变量的String()进行输出。 -
有一种特殊的struct{}类型的channel,他不能被写入任何数据,只有通过close()函数进行关闭操作,才能进行输出操作。struct类型的channel不占用任何内存,定义:
var sig=make(chan struct{})
-
使用空struct是对内存更友好的开发方式,在go源码中,针对空struct类型的内存申请补发,返回地址都是一个固定的地址,避免了内存滥用。一个用途是联合管道,实现并发等待。
package main
import (
"fmt"
"time"
)
func main03() {
ch:=make(chan struct{}) //数据为空没有意义 通知作用
go func() {
time.Sleep(time.Second)
fmt.Println("协程 完成")
close(ch)
}()
fmt.Println("主函数执行")
<-ch
fmt.Println("主函数执行完成")
}