目录
结构体类型(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(小于),您的支持是我不断更新的动力。