Bootstrap

Go-结构体类型详解(声明、初始化、结构体指针、方法、序列化等)

目录

结构体类型(struct)

声明

声明并初始化

结构体指针

方法

Generate

方法和函数的区别

匿名结构体

序列化

全部代码

截图


结构体类型(struct)

去除了C++等语言的的继承、方法重载、构造函数、析构函数、隐藏的this指针,很简洁

type 变量名 struct{

    属性

}

属性

变量 类型

代码

type FaShi struct{
	name string
	sex string
	Skins []string `json:"skin"`
	AttackPower int `json:"ap"`
}

json相关在后面序列化部分讲解。

声明

	var shangGuan FaShi
	var huoWu  = FaShi{}
	xiaoQiao := new(FaShi)
	shangGuan.Skins = append(shangGuan.Skins, "天狼绘梦者")
	huoWu.Skins = append(huoWu.Skins, "魅语")
	(*xiaoQiao).sex = "女"
	xiaoQiao.name = "小乔" //简化

注意:指针可以不需要(*p).,编译器进行了隐式转化,这与Go一贯的显示转换不同,个人并不喜欢。

声明并初始化

使用{key:value}形式

	zhouYu := FaShi{name:"zhouyu",sex:"男",AttackPower:789}

结构体指针

得到结构体的地址,就是结构体指针

	fa := &xiaoQiao
	(*fa).Skins = append((*fa).Skins, "青蛇")

方法

func (reciver type) methodName([parameter list]) ([return list]){

    body

    return value

}

 来个输出格式化的代码

func (f *FaShi) String() string{
	skins := ""
	for _,s:= range f.Skins{
		skins += s+" "
	}
	return "姓名:"+f.Name()+" 性别:"+f.Sex()+" 攻击力:"+fmt.Sprintf("%d",f.AttackPower)+" 皮肤:"+skins
}

Generate

GoLand有generate,可以生成构造函数和Getter、Setter

构造函数使用工厂模式,根据属性来进行对象的创建。选中首字母小写的属性,右键点击Generate或快捷键Alt+Insert。

代码

func NewFaShi(name string) *FaShi {
	return &FaShi{name: name}
}

func (f *FaShi) Sex() string {
	return f.sex
}

func (f *FaShi) SetSex(sex string) {
	f.sex = sex
}

func (f *FaShi) Name() string {
	return f.name
}

func (f *FaShi) SetName(name string) {
	f.name = name
}

使用

shangGuan.SetName("上官婉儿")
huoWu.SetName("不知火舞")

方法和函数的区别

1)调用方式不一样

  • 函数的调用方式:函数名(实参列表)
  • 方法的调用方式:变量方法名(实参列表)

2)对于普通函数,形参为值类型时,不能将指针类型的数据直接传递,反之亦然

3)对于方法,形参为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以,内部属性是否改变取决于形参

匿名结构体

直接将结构体赋给一个变量

代码

	zhuGe := struct {
		Name string
	}{Name:"诸葛亮"}

序列化

func Marshal(v interface{}) ([]byte, error)

Marshal函数返回v的json编码。 

代码

	shangJson, _ := json.Marshal(shangGuan)

注意:由于一般json的格式字符串都是小写的,所以希望返回小写的,但是结构体小写的属性又无法外部访问,所以在结构体的属性后面加了`json 转json后的名字`

全部代码

package main

import (
	"encoding/json"
	"fmt"
)

type FaShi struct{
	name string
	sex string
	Skins []string `json:"skin"`
	AttackPower int `json:"ap"`
}

func NewFaShi(name string) *FaShi {
	return &FaShi{name: name}
}

func (f *FaShi) Sex() string {
	return f.sex
}

func (f *FaShi) SetSex(sex string) {
	f.sex = sex
}

func (f *FaShi) Name() string {
	return f.name
}

func (f *FaShi) SetName(name string) {
	f.name = name
}
func (f *FaShi) String() string{
	skins := ""
	for _,s:= range f.Skins{
		skins += s+" "
	}
	return "姓名:"+f.Name()+" 性别:"+f.Sex()+" 攻击力:"+fmt.Sprintf("%d",f.AttackPower)+" 皮肤:"+skins
}

func main() {
	//--------声明-----------
	var shangGuan FaShi
	var huoWu  = FaShi{}
	xiaoQiao := new(FaShi)
	shangGuan.Skins = append(shangGuan.Skins, "天狼绘梦者")
	huoWu.Skins = append(huoWu.Skins, "魅语")
	(*xiaoQiao).sex = "女"
	xiaoQiao.name = "小乔" //简化
	fmt.Println("shangGuan Huowu xiaoQiao",shangGuan,huoWu,*xiaoQiao)
	//-------声明并初始化--------
	zhouYu := FaShi{name:"zhouyu",sex:"男",AttackPower:789}
	fmt.Println("zhouYu:",zhouYu)
	//----------结构体指针-------
	fa := &xiaoQiao
	(*fa).Skins = append((*fa).Skins, "青蛇")
	fmt.Println("小乔的皮肤:",xiaoQiao.Skins)
	//----------方法------------
	fmt.Println(huoWu.String())
	//---------generate-------
	shangGuan.SetName("上官婉儿")
	huoWu.SetName("不知火舞")
	fmt.Println("shangGuan的名字 huoWu的名字:",shangGuan.Name(),huoWu.Name())
	//--------匿名结构体---------
	zhuGe := struct {
		Name string
	}{Name:"诸葛亮"}
	fmt.Println("zhuGe的名字:",zhuGe.Name)
	//---------序列化-----------
	shangJson, _ := json.Marshal(shangGuan)
	fmt.Println(string(shangJson))
}

截图

更多Go相关内容:Go-Golang学习总结笔记

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。

;