结构体
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}}
}