Go基础及语法(四)

结构体

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}}
}


原文地址:https://www.cnblogs.com/bgr1115/p/14298447.html