go语言结构体的定义、实例化、初始化、成员函数、Json数据和结构体之间的互相转换关系
//------------------------结构体内容练习--------------------
//-- 结构体定义,没有分配内存
type Person struct {
Name string
Age int
}
//-- 给结构体添加函数成员
func (p Person) print() {
fmt.Println("Person Name =", p.Name, "Age =", p.Age)
}
//-- 结构体指针接收器(p指向 Person类型对象的地址)
func (p *Person) print2() {
fmt.Println("Person Name =", p.Name, "Age =", p.Age)
}
//-- 可以给任意类型添加方法,包括内置类型
type MyString string
func (m MyString) IsLargeString() bool {
fmt.Println("IsLargeString =", m)
if len(m) > 10 {
return true
}
return false
}
//-- 结构体动定义,结构体实例化,结构体初始化等
func GoStructTest() {
//-- 结构体定义,没有分配内存
type Person struct {
Name string
Age int
}
//-- 结构体实例化,分配内存
var p Person
fmt.Println("var p Person = ", p) //var p Person = { 0}
var stu = new(Person)
fmt.Println("new(Person) = ", stu) //new(Person) = &{ 0}
var stu1 = &Person{}
fmt.Println("var stu1 = &Student{} = ", stu1) //var stu1 = &Student{} = &{ 0}
//-- 使用列表初始化
var stu2 = Person{
"kongzi",
1998,
}
fmt.Println("stu2 =", stu2)
//-- 定义一个匿名结构体,并初始化(不需要写type 关键字也不用写结构体的名字)
stu3 := struct {
Name string
Age int
Score float64
}{
"HaiCoder",
18,
99.5,
}
fmt.Println("Student =", stu3)
//-- 结构体嵌套
//-- 结构体添加方法,要在函数外添加
//-- 结构体指针接收器
//-- 定义一个结构体,并给该结构体方法添加指针接收器
//-- 可以给任意类型添加方法
var myStr MyString = "sssbbb"
myStr.IsLargeString()
//-- json数据放到结构体中
JsonToStruct()
//-- Go语言结构体转Json
StructToJson()
//-- 结构体使用Tag标记
UsedTagJsonToStruct()
UsedTagStructToJson()
}
//------------------------结构体与Json互转的练习--------------------
//-- Golang 结构体与Json配合使用
//-- 将Json存放到结构体中
func JsonToStruct() {
jsonStr := `{"Name":"HaiCoderLX", "Age": 18}`
var p Person
if err := json.Unmarshal([]byte(jsonStr), &p); err != nil {
fmt.Println("Error = ", err)
return
}
fmt.Println("Person = ", p)
}
//-- Go语言结构体转Json
func StructToJson() {
person := &Person{
Name: "ppt1",
Age: 28,
}
if jsonStr, err := json.Marshal(person); err != nil {
fmt.Println("err=", err)
} else {
fmt.Println("jsonStr = ", jsonStr)
fmt.Println("jsonStr = ", string(jsonStr))
}
}
type Studen struct {
//-- 上面是两种错误的写法,看看有什么不同
// PName string `json:Name`
// pAge int `json:Age`
PName string `json:"Name"`
PAge int `json:"Age"`
}
//--Go语言结构体 Tag
//-- 我们设置了 Tag,因此将 Json 串转成结构体时,会使用结构体中的 Tag 来匹配 Json 串中的 key,并将对应的字段解析到结构体中
func UsedTagJsonToStruct() {
jsonStr := `{"Web": "haicoder.net", "Name":"HaiCo", "Age":18, "Score": 99.2}`
var p Studen
if err := json.Unmarshal([]byte(jsonStr), &p); err != nil {
fmt.Println("Err=", err)
return
}
fmt.Println("p=", p)
}
func UsedTagStructToJson() {
//var st Studen;
st := &Studen{
PName: "haiGnagfeng",
PAge: 154,
}
if jsonStr, err := json.Marshal(st); err != nil {
fmt.Println("Err=", err)
} else {
fmt.Println("jsonStr=", string(jsonStr))
}
}