关于结构体
就是js类概念 提供一个自定义数据类型,struct
Type 关键字
Golang中通过type关键词定义一个结构体,需要注意的是,数组和结构体都是值类型
自定义类型
type myInt int
//面代码表示:将mylnt定义为int类型,通过type关键字的定义,mylnt就是一种新的类型,它具有int的特性。
type myInt int
func main() {
var a myInt = 10
fmt.Printf("%v %T", a, a)
}
结构体定义和初始化
使用type 和 struct关键字来定义结构体,具体代码格式如下所示:
/**
定义一个人结构体
*/
type Person struct {
name string
age int
sex string
}
func main() {
// 实例化结构体
var person Person
person.name = "张三"
person.age = 20
person.sex = "男"
fmt.Printf("%#v", person)
//实例化结构体2
var person2 = new(Person)
person2.name = "李四"
person2.age = 30
person2.sex = "女"
fmt.Printf("%#v", person2)
//实例化结构体3 使用&对结构体进行取地址操作,相当于对该结构体类型进行了一次new实例化操作
var person3 = &Person{}
person3.name = "赵四"
person3.age = 28
person3.sex = "男"
fmt.Printf("%#v", person3)
//实例化结构体4
var person4 = Person{
name: "张三",
age: 10,
sex: "女",
}
fmt.Printf("%#v", person4)
}
注意:结构体首字母可以大写也可以小写,大写表示这个结构体是公有的,在其它的包里面也可以使用,小写表示结构体属于私有的,在其它地方不能使用
结构体方法和接收者
func (接收者变量 接收者类型) 方法名(参数列表)(返回参数) {
函数体
}
/**
定义一个人结构体
*/
type Person struct {
name string
age int
sex string
}
// 定义一个结构体方法
func (p Person) PrintInfo() {
fmt.Print(" 姓名: ", p.name)
fmt.Print(" 年龄: ", p.age)
fmt.Print(" 性别: ", p.sex)
fmt.Println()
}
func (p *Person) SetInfo(name string, age int, sex string) {
p.name = name
p.age = age
p.sex = sex
}
func main() {
var person = Person{
"张三",
18,
"女",
}
person.PrintInfo() // 姓名: 张三 年龄: 18 性别: 女
person.SetInfo("李四", 18, "男")
person.PrintInfo() // 姓名: 李四 年龄: 18 性别: 男
}
如果结构体的字段类似是:指针、slice、和 map 的零值都是nil,即还没有分配空间
如果需要使用这样的字段,需要先make,才能使用
/**
定义一个人结构体
*/
type Person struct {
name string
age int
hobby []string
mapValue map[string]string
}
func main() {
// 结构体的匿名字段
var person = Person{}
person.name = "张三"
person.age = 10
// 给切片申请内存空间
person.hobby = make([]string, 4, 4)
person.hobby[0] = "睡觉"
person.hobby[1] = "吃饭"
person.hobby[2] = "打豆豆"
// 给map申请存储空间
person.mapValue = make(map[string]string)
person.mapValue["address"] = "北京"
person.mapValue["phone"] = "123456789"
// 加入#打印完整信息
fmt.Printf("%#v", person)
}
同时我们还支持结构体的嵌套,如下所示
// 用户结构体
type User struct {
userName string
password string
sex string
age int
address Address // User结构体嵌套Address结构体
}
// 收货地址结构体
type Address struct {
name string
phone string
city string
}
func main() {
var u User
u.userName = "moguBlog"
u.password = "123456"
u.sex = "男"
u.age = 18
var address Address
address.name = "张三"
address.phone = "110"
address.city = "北京"
u.address = address
fmt.Printf("%#v", u)
}
Go中的结构体和Json相互转换
比如我们Golang要给App或者小程序提供Api接口数据,这个时候就需要涉及到结构体和Json之间的相互转换 Golang JSON序列化是指把结构体数据转化成JSON格式的字符串,Golang JSON的反序列化是指把JSON数据转化成Golang中的结构体对象
Golang中的序列化和反序列化主要通过“encoding/json”包中的 json.Marshal() 和 son.Unmarshal()
// 定义一个学生结构体,注意结构体的首字母必须大写,代表公有,否则将无法转换
type Student struct {
ID string
Gender string
Name string
Sno string
}
func main() {
var s1 = Student{
ID: "12",
Gender: "男",
Name: "李四",
Sno: "s001",
}
// 结构体转换成Json(返回的是byte类型的切片)
jsonByte, _ := json.Marshal(s1)
jsonStr := string(jsonByte)
fmt.Printf(jsonStr)
}