结构体类型(struct)
去除了C++等语言的的继承、方法重载、构造函数、析构函数、隐藏的this指针,很简洁
type 变量名 struct{
属性
}
属性
变量 类型
代码
1. type FaShi struct{ 2. name string 3. sex string 4. Skins []string `json:"skin"` 5. AttackPower int `json:"ap"` 6. }
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学习总结笔记
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。