一、结构体
Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。但是它相当于java中的实体类。
Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct
。 也就是我们可以通过struct
来定义自己的类型了。
Go语言中通过struct
来实现面向对象。
在Go语言中有一些基本的数据类型,如string
、整型
、浮点型
、布尔
等数据类型, Go语言中可以使用type
关键字来定义自定义类型。比如下面的Person结构体:
// Person 结构体
type Person struct {
name string
age int
}
什么是结构体中的tag呢?
tag
是结构体的元信息,可以在运行的时候通过反射的机制读取出来。 Tag
在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下:
type Person struct {
ID int `json:"id"` //通过指定tag实现json序列化该字段时的key
Name string
Age int
}
二、结构体实战
package main
import "fmt"
/**
struct 结构体
结构体是将零个或者多个类型的变量,组合在一起的聚合数据变量。也可以当做是数据的集合。
*/
func main() {
var p1 Person
p1.age = 10
p1.name = "钟渊"
fmt.Println(p1)
var p2 = Person{age: 20, name: "zhangsan"}
fmt.Println(p2)
p3 := Person{age: 30, name: "xiaozhang"}
fmt.Println(p3)
//匿名结构体
p4 := struct {
name string
age int
}{
name: "wangsi",
age: 33,
}
fmt.Println(p4)
}
// Person 结构体
type Person struct {
name string
age int
}
三、结构体的序列化
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON键值对是用来保存JS对象的一种方式,键/值对组合中的键名写在前面并用双引号""
包裹,使用冒号:
分隔,然后紧接着值;多个键值之间使用英文,
分隔。
package main
import (
"encoding/json"
"fmt"
)
type Result struct {
Code int `json:"code"`
Msg string `json:"msg"`
}
// 结构体的序列化
func main() {
var r Result
r.Code = 200
r.Msg = "success"
// 序列化 需要序列化的结构体中的字段首字母必须大写
jsons, errs := json.Marshal(r)
if errs != nil {
fmt.Println("jsons error", errs)
}
fmt.Println("json data=", string(jsons))
fmt.Println("r data=", r)
var r2 Result
// 反序列化
errs = json.Unmarshal(jsons, &r2)
if errs != nil {
fmt.Println(" error ", errs)
}
fmt.Println("r2=", r2)
toJson(&r)
setData(&r)
toJson(&r)
}
func toJson(res *Result) {
jsons, errs := json.Marshal(res)
if errs != nil {
fmt.Println("res marshal error", errs)
}
fmt.Println("data", string(jsons))
}
func setData(res *Result) {
res.Code = 500
res.Msg = "服务器错误"
}