第
Go结构体的基本使用详解
目录定义实例化匿名结构体空结构体构造函数方法与接收者匿名字段实现面向对象的继承特性标签tag结构体与JSON系列化本文主要介绍Go的结构体类型的基本使用,快速上车
定义
结构体,是一种自定义的数据类型,由多个数据类型组合而成。用于描述一类事物相关属性。
定义方式:
type类型名struct{
字段名字段类型
//示例:
typeAnimalstruct{
Namestring
Ageint
实例化
结构体和结构体指针,两者的实例化有所区别(注意:结构体指针必须手动初始化,分配内存地址)
提供多种写法,灵活使用:
//结构体实例化
//写法1
//varaAnimal
//a.Name=aaa
//a.Age=18
//写法2
a:=Animal{
Name:dog,
Age:18,
fmt.Println(fmt.Sprintf(%T-%v,a,a))//main.Animal-{dog18}
//结构体指针实例化
//写法1
varb*Animal
b=new(Animal)
//写法2
//b:=new(Animal)
//写法3
//b:=Animal{}
b.Name=cat//在底层是(*b).Name=cat,这是Go语言帮我们实现的语法糖
fmt.Println(fmt.Sprintf(%T-%v,b,b))//*main.Animal-{cat0}
匿名结构体
适用于临时数据存储的场景
varvstruct{
Namestring
Ageint
fmt.Println(v)
空结构体
不占用内存空间
varvstruct{}
fmt.Println(unsafe.Sizeof(v))//0
v1:=struct{}{}
fmt.Println(unsafe.Sizeof(v1))//0
构造函数
Go没有自带的构造函数,采用自实现
定义方式1:结构体不复杂,可以返回结构体类型,值拷贝性能开销小
funcNewPerson(namestring,ageint8)Person{
returnPerson{
name:name,
age:age,
定义方式2:结构体复杂,得返回结构体指针类型,避免值拷贝产生的性能开销
funcNewPerson(namestring,ageint8)*Person{
returnPerson{
name:name,
age:age,
方法与接收者
方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于PHP中的this或者self。
方法与函数区别:函数不属于任何类型,方法属于特定类型
标准格式:
func(接收者变量接收者类型)方法名(参数列表)(返回参数){
接收者类型(两种):
非指针类型:发生值拷贝产生副本,方法内修改字段,只在方法内生效;指针类型:不产生副本,方法内修改字段,同步生效;
funcNewPerson(namestring,ageint8)*Person{
returnPerson{
name:name,
age:age,
func(p*Person)Dream(){
p.name=aaa
fmt.Printf(%s的梦想是学好Go语言\n,p.name)//aaa的梦想是学好Go语言
funcmain(){
p1:=NewPerson(小王子,25)
p1.Dream()
fmt.Println(p1)//{aaa25}
什么时候使用指针类型的接收者:
需要修改接收者中的值接收者是拷贝代价比较大的大对象保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者
注意点:
1.接收者类型,可以是任何类型,不仅仅只针对结构体类型。但要注意下,类型和方法定义得在同一个包下面
typeMyIntint
func(iMyInt)SayInt(){
fmt.Println(mytypeisMyInt)
funcmain(){
vari1MyInt
i2:=MyInt(10)
i1