Go基础及语法(四)

mb6004f83c7725c · · 276 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

结构体,匿名结构体,构造函数,方法和接收者,结构体的值,结构体的嵌套和匿名字段,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基础及语法(四)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

276 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传