结构体,匿名结构体,构造函数,方法和接收者,结构体的值,结构体的嵌套和匿名字段,JSON序列化与反序列化
结构体
package main import "fmt" //定义结构体 type person struct { name string age int } func main() { p1 := person{name: "a", age: 18} //初始化结构体 fmt.Println(p1) //{a 18} }
匿名结构体
package main import "fmt" func main() { //匿名结构体 p2 := struct { name string age int }{name: "b", age: 20} fmt.Println(p2.name, p2.age) //b 20 }
构造函数
package main import "fmt" type person struct { name string age int } //构造函数 func newPerson(s string, i int) (p person) { p = person{ name: s, age: i, } return p } func main() { p3 := newPerson("c", 22) //初始化结构体 fmt.Println(p3) //{c 22} }
方法和接收者
package main import "fmt" type person struct { name string age int } func newPerson(s string, i int) (p person) { p = person{ name: s, age: i, } return p } /* 构造方法 func (接收者 类型) 方法名(){ 方法主体 } */ func (p person) method() { fmt.Println("person's method") //person's method } func main() { p4 := newPerson("d", 24) //初始化结构体 p4.method() //调用方法 }
结构体的值
在Go语言中,函数之间参数的传递都是经过拷贝的,如果想在方法上修改结构体的值,需传入指针
package main import "fmt" type person struct { name string age int } func newPerson(s string, i int) (p person) { p = person{ name: s, age: i, } return p } func (p person) method1() { p.age++ } //*接收传递参数的指针 func (p *person) method2() { p.age++ } func main() { p5 := newPerson("d", 24) p5.method1() fmt.Println(p5.age) //24 p5.method2() fmt.Println(p5.age) //25 }
结构体的嵌套和匿名字段
package main import "fmt" type person struct { name string age int } type school struct { class string person //结构体的匿名字段 } func main() { s := school{ class: "A", person: person{ name: "a", age: 18, }, } fmt.Println(s) //{A {a 18}} }
JSON序列化与反序列化
package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int } type school2 struct { Class string Person Person } func main() { s := school2{ Class: "A", Person: Person{ Name: "a", Age: 18, }, } k, v := json.Marshal(s) //JSON序列化 if v != nil { fmt.Println("JSON反有误") } fmt.Println(string(k)) //{"Class":"A","Person":{"Name":"a","Age":18}} }
匿名结构体
package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int } type school struct { Class string Person } func main() { s := school{ Class: "A", Person: Person{ Name: "a", Age: 18, }, } k, v := json.Marshal(s) //序列化 if v != nil { fmt.Println("JSON反有误") } fmt.Println(string(k)) //{"Class":"A","Name":"a","Age":18} var s2 school json.Unmarshal([]byte(string(k)), &s2) //反序列化 fmt.Println(s2) //{A {a 18}} }
有疑问加站长微信联系(非本文作者)