结构体
结构体定义
type 结构体名 struct{
字段1 字段1的类型
字段2 字段2的类型
}
结构体初始化
先声明再赋值
var p person // 声明一个person类型的变量P
p.name = "名字"
p.age = 18
fmt.Println(p)
声明同时初始化
键值对初始化
var p2 = person{
"理想",
100,
}
fmt.Println(p2)
注意事项
- 两者不能混用
- 没有赋值的字段会使用对应类型的零值
结构体指针
结构体是值类型,赋值的时候都是拷贝
当结构体字段较多的时候,为了减少内存消耗可以传递结构体指针
构造函数
返回一个结构体变量的函数,为了实例化结构体的到时候更省事
func newPerson(name string,age int)person{
return person{
name: name,
age: age,
}
}
方法
方法是作用于特定类型的函数
方法的定义:
func (接受者变量 接受者类型) 方法名(参数)返回值{
// 方法体
}
接受者
接受者通常使用类型首字母的小写,不建议使用this和self这样的
值接受者和指针接受者的区别
使用值接受者的方法不能修改结构体变量
使用指针接收者的方法可以修改结构体的变量
标识符
// 标识符:变量名 函数名 类型名 方法名
匿名字段
没有名字的字段
嵌套结构体
type address struct{
province string
city string
}
type company struct{
name string
addr address // 嵌套
}
匿名嵌套结构体
type address struct{
provice string
city string
}
type company struct{
name string
address // 嵌套匿名结构体
}
匿名嵌套结构体的字段冲突
先在自己结构体找到这个字段,找不到就去匿名嵌套的结构体中查找该字段
type address struct{
province string
city string
}
type workPlace struct{
province string
city string
}
type person struct{
name string
age int
address
workPlace
}
结构体与json
json:一种跨语言的数据格式,多用于不同语言之间传递数据
// 1. 序列化:把go语言中的结构体变量 --> json格式的字符串
// 2. 反序列化: json格式的字符串 --> go语言中能够识别的结构体变量
type person struct{
Name string `json:"name" db:"name" ini:"name"`
Age int `json:"age"`
}
func main(){
p1 := person{
Name :"名称",
Age : 18
}
// 序列化
b, err := json.Marsha1(p1)
if err!=nil{
return
}
// 反序列化
str := `{"name":"a","age":18}`
var p2 person
json.Unmarsha1([]byte(str),&p2)
// 传指针是为了能够在json.Unmarsha1内部修改p2的值
}