本网站可以通过分类标签帮助你快速筛选出你想看的文章,记住地址:www.Facec.cc

Golang结构体详解 结构体序列化 结构体转json

定义和初始化

type Person struct{
	name string
	age int
	sex string
}

// 初始化-方法1
var p1 Person
p1.name = "张三"
p1.sex = "男"
p1.age = 20

fmt.Printf("值:%v, 类型:%T\n",p1,p1) //值:{张三 20 男} 类型:main.Person
fmt.Printf("值:%#v, 类型:%T\n",p1,p1) //值:main.Person{name:"张三", age:20, sex:"男"} 类型:main.Person

// 初始化-方法2
var p2 = new(Person)
p2.name = "xxx"
//注意: 此时的p2是一个结构指针,打印%T为*main.Person

// 初始化-方法3,同方法2
var p3 = &Person{}

//初始化-方法4
p4 := Person{
	name:"张三",
	age:20,
	"sex":"女"
}

// 初始化-方法5,指针类型
p5 := &Person{
	name:"小六",
	age:20,
	"sex":"女"
}

注意

  • 打印结构体尽量用: %#v
  • 支持对结构体指针直接使用.(点)来访问结构体成员.p2.name="张三"在底层实际上是(*p2).name="张三"
  • 结构体也是值传递

结构体方法

type Person struct{
	Name string,
	Age int,
	Sex string,
	height int
}

//添加方法
func (p Person) PrintInfo(){
	fmt.Printf("姓名:%v, 年龄:%v", p.name, p.age)
}

//添加一个内部方法,修改结构体的值,需要用结构体指针
func (p *Person) SetInfo(name string, age int){
	p.Name = name
	p.Age  = age
}

自定义类型添加方法

image.png

结构体的嵌套

image.png

注意

  • 可以使用u.City = "上海"直接修改, 当访问结构体成员时会先在结构体中查看该字段, 找不到再去匿名结构体中查找.

结构体转json

type Student struct{
	Id int `json:"id"`,//指定json序列化时该字段的key
	Gender string `json:"gender"`
}

//结构体转json
jsonByte, _ := json.Marshal(stu1)
jsonStr := string(jsonByte)
fmt.Printf("%v", jsonStr)

//json转结构体
var str = `{"Id":10,"Name":"王丰","Gender":"男","Sno":"204804"}`
var stu1 = Student

json.Unmarshal([]byte(str), &stu1)

// 在使用json.Unmarshal时,往往需要进行类型断言判断,因为str不能保证为string类型, 需要先 str2,ok := str.(string),当ok==true时,str2为string类型

注意

  • 私有字段没法被json包访问
# golang   json  

评论