一、声明结构体

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))
}