Go语言结构体和方法
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\n%p\n%p\n",&(s.Name),&(s.age),&(s.score))
}
func main(){
structtest()
}
结果:
0xc000004460
0xc000004470
0xc000004478
struct链表:
链表定义:
type Student struct {
Name string
Next *Student
}
每个节点包含下一个节点的地址,这样把所有的节点串起来了,通常把 链表中的第一个节点叫做链表头
golang中的struct没有构造函数,一般可以使用工厂模式来解决这个问题
目录结构

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
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()
I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

浙公网安备 33010602011771号