一、声明结构体
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
var p1 Person
p1.Name = "张三"
p1.Age = 18
fmt.Println("p1 = ", p1) // p1 = {张三 18}
p2 := Person{
Name: "李四",
Age: 19,
}
fmt.Println("p2 = ", p2) // p1 = {张三 18}
// 匿名结构体
p3 := struct {
Name string
Age int
}{Name: "王五", Age: 20}
fmt.Println("p3 = ", p3) // p3 = {王五 20}
}
二、Json序列化
问:为什么要序列化?
答:结构体可以通过序列化将其转换为可传输的数据格式,以便在网络上传输或存储到文件中。
package main
import (
"encoding/json"
"fmt"
)
type Result struct {
Code int `json:"code"`
Message string `json:"message"`
}
func main() {
var result Result
result.Code = 200
result.Message = "成功"
// 序列化 得到一个JSON格式的字节切片
jsons, err := json.Marshal(result)
if err != nil {
fmt.Println("json Marshal error: ", err)
}
// json date: {"code":200,"message":"成功"}
fmt.Println("json date: ", string(jsons))
// 反序列化
var result2 Result
err2 := json.Unmarshal(jsons, &result2)
if err2 != nil {
fmt.Println("json Unmarshal error: ", err2)
}
// result2: {200 成功}
fmt.Println("result2: ", result2)
}
三、修改结构里属性的值
由于结构体也是值类型,所以在函数传递时,如果要在函数中直接修改数据,需要传递指针类型
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name""`
Age int `json:"age""`
}
func main() {
person := Person{
Name: "zhangsan",
Age: 17,
}
toJson(person) // person json date: {"name":"zhangsan","age":17}
birthday(&person)
toJson(person) // person json date: {"name":"zhangsan","age":17}
}
func birthday(person *Person) {
person.Age++
}
func toJson(person Person) {
jsons, err := json.Marshal(person)
if err != nil {
fmt.Println("json Marshal error: ", err)
}
fmt.Println("person json date: ", string(jsons))
}