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