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

使用{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


![img](https://img-blog.csdnimg.cn/img_convert/16168afb410848c96b967bb639ba65e8.png)
![img](https://img-blog.csdnimg.cn/img_convert/9201ba81d3d453bf3f31ff9623edc5ed.png)
![img](https://img-blog.csdnimg.cn/img_convert/8d9c2ef415f77b1180600383ec9ed8db.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**


加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0

[外链图片转存中...(img-34Qwfk5A-1725657944601)]
[外链图片转存中...(img-umjxCnp7-1725657944601)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**


加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值