struct的使用:
1. 用来自定义复杂数据结构
2. struct里面可以包含多个字段(属性)
3. struct类型可以定义方法,注意和函数的区分
4. struct类型是值类型
5. struct类型可以嵌套
6. Go语言没有class类型,只有struct类型
struct声明:
type 标识符 struct { field1 type field2 type } 例如: type Student struct { Name string Age int Score int }
struct 中字段访问:和其他语言一样,使用点
var stu Student stu.Name = “tony” stu.Age = 18 stu.Score=20 fmt.Printf(“name=%s age=%d score=%d”, stu.Name, stu.Age, stu.Score)
struct定义的三种形式:
var stu Student var stu *Student = new (Student) var stu *Student = &Student{}
其中b和c返回的都是指向结构体的指针,访问形式如下
stu.Name、stu.Age和stu.Score或者 (*stu).Name、(*stu).Age等
struct的内存布局:struct中的所有字段在内存是连续的。
package main import ( "fmt" "sort" ) type stru struct { Name string age int score int } func structtest(){ s :=stru{ Name:"alex", age:16, score:19, } fmt.Printf("%p %p %p ",&(s.Name),&(s.age),&(s.score)) } func main(){ structtest() }
结果:
0xc000004460
0xc000004470
0xc000004478
struct链表:
链表定义:
type Student struct { Name string Next *Student }
每个节点包含下一个节点的地址,这样把所有的节点串起来了,通常把 链表中的第一个节点叫做链表头
golang中的struct没有构造函数,一般可以使用工厂模式来解决这个问题
目录结构
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package model type Student struct { Name string Age int } func NewStudent(name string, age int) *Student { //返回地址 //return &Student{ // Name: name, // Age: age, //} var stu *Student = new(Student) stu.Name = name stu.Age = age return stu } var Re = 32
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package main import ( "./model" "fmt" ) func main(){ fmt.Println(model.Re) //引用包内的变量 S := new (model.Student) //返回值类型 S = model.NewStudent("tony", 20) fmt.Println(S.Name) fmt.Printf("%T",S) //打印S类型 }
make与new的区别
make 用来创建map、slice、channel new用来创建值类型
new用来创建值类型
struct中的tag与序列化
我们可以为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() { data, err := json.Marshal(stu) if err != nil { fmt.Println("json encode stu failed, err:", err) return } fmt.Println(string(data)) }
struct的方法调用
type A struct { a int } func (this A) test() {fmt.Println(this.a) } var t A t.test()