Go基础及语法(四)


本文摘自网络,作者,侵删。

结构体,匿名结构体,构造函数,方法和接收者,结构体的值,结构体的嵌套和匿名字段,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}}
}


本文来自:51CTO博客

感谢作者:mb6004f83c7725c

查看原文:Go基础及语法(四)

相关阅读 >>

Golang xml 解析神器 etree 转载自“北极熊博客”

Golang "github.com/pkg/errors" 包使用的正确姿势

Golang语言社区--unity3d学习 第1期 如何学习unity3d

手撸Golang etcd raft协议之11

windows10下编译Go项目为linux可执行文件

stream:我们为何要从python转到Go语言?

网站怎么没跳页操作,不过通过url能跳

手把手教你vscode配置Golang开发环境的步骤

手撸Golang Go与微服务 saga模式之9 小结/gitee源码

Golang 可以写游戏吗?

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...