golang 结构体(struct)
1. 结构体定义
- Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Gelang是基于struct来实现OOP特性的。
- 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和一个类型。
2. 结构体创建
需要注意的是:
- 结构体的包名在同一个包内必须唯一,不能重复
- 结构体的字段必须唯一,不能重复
- 同类型的结构体字段可以放在一行定义
结构体格式
type structname struct {
field1 type
field2 type
...
}
type:结构体定义关键字
structname:结构体名称
struct:结构体定义关键字
field type:成员变量名称,成员数据类型
3. 结构体的初始化
没有初始化的结构体默认值都为类型的默认值。
3.1 直接创建初始化
package main
import "fmt"
// 定义一个Perple结构体
type People struct {
SurName string
Age int
sex string
}
func main() {
//创建一个实例
var p1 People
p1.SurName = "张"
p1.Age = 20
p1.sex = "男"
fmt.Println(p1)
}
执行结果
{张 20 男}
3.2 根据成员初始化
package main
import "fmt"
// 定义一个Perple结构体
type People struct {
SurName string
Age int
sex string
}
func main() {
var p2 People
/* p2 = People{ //根据声明的成员名称初始化。注意:最后的逗号不能少
Age: 24,
SurName: "李",
sex: "男",
}*/
p2 = People{ //根据结构体声明顺序初始化,顺序不能变
"李",
24,
"男",
}
fmt.Println(p2)
}
执行结果
{李 24 男}
3.3 初始化部分成员
package main
import "fmt"
// 定义一个Perple结构体
type People struct {
SurName string
Age int
sex string
}
func main() {
p3 := People{ //初始化部分成员,,没有初始化的成员为类型默认值
SurName: "詹",
sex: "女",
}
fmt.Println(p3)
}
执行结果
{詹 0 女}
4. 结构体指针
package main
import "fmt"
// 定义一个Perple结构体
type People struct {
SurName string
Age int
sex string
}
func main() {
p4 := People{
"李",
24,
"男",
}
var p4_pointer = new(People) //等价于var p4_pointer *People
p4_pointer = &p4
fmt.Printf("p4的内存地址为:%p\n", p4_pointer)
fmt.Printf("p4的值为:%v\n", *p4_pointer)
//修改实例的值
(*p4_pointer).SurName = "张" //*的作为为根据内存地址取值,这个*号可以省略
p4_pointer.Age = 28
fmt.Printf("p4的值为:%v\n", *p4_pointer)
}
执行结果
p4的值为:{李 24 男}
p4的值为:{张 28 男}
5. 结构体实例跟json格式转换
5.1 实例转json
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string
Age int
Provice string
}
func main() {
//实例转json格式
s := Student{
Name: "li",
Age: 25,
Provice: "JX",
}
s1, err := json.Marshal(s) //将实例转为json格式
if err != nil {
fmt.Println("err:", err)
}
fmt.Println(string(s1)) //转换后的s1为[]byte类型,需要转为字符串类型
}
执行结果
{"Name":"li","Age":25,"Provice":"JX"}
5.2 json转实例
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string
Age int
Provice string
}
func main() {
//json转结构体实例
j := `{"Name":"li","Age":25,"Provice":"JX"}` //定义一个json格式字符串
var j1 Student //定义一个实例
err := json.Unmarshal([]byte(j), &j1)
if err != nil {
fmt.Println("err:", err)
}
fmt.Printf("%#v", j1)
}
执行结果
main.Student{Name:"li", Age:25, Provice:"JX"}
6. 结构体标签(tag)
标签定义:json:"标签名"
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string `json:"name""`
Age int `json:"age""`
provice string // 小写字母开头的不会参与序列化
}
func main() {
//结构体实例转json格式
s := Student{
Name: "li",
Age: 25,
provice: "JX",
}
s1, err := json.Marshal(s) //将实例转为json格式
if err != nil {
fmt.Println("err:", err)
}
fmt.Println(string(s1)) //转换后的s1为[]byte类型,需要转为字符串类型
}
执行结果
{"name":"li","age":25}