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

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

结构体类型(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。

2020062310470442.png

代码

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))
}

截图

2020062310470442.png

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

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。


相关文章
|
13天前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
2月前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
37 5
|
2月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
存储 缓存 Java
涨姿势啦!Go语言中正则表达式初始化的最佳实践
在Go语言中,正则表达式是处理字符串的强大工具,但其编译过程可能消耗较多性能。本文探讨了正则表达式编译的性能影响因素,包括解析、状态机构建及优化等步骤,并通过示例展示了编译的时间成本。为了优化性能,推荐使用预编译策略,如在包级别初始化正则表达式对象或通过`init`函数进行错误处理。此外,简化正则表达式和分段处理也是有效手段。根据初始化的复杂程度和错误处理需求,开发者可以选择最适合的方法,以提升程序效率与可维护性。
52 0
涨姿势啦!Go语言中正则表达式初始化的最佳实践
|
3月前
|
设计模式 Java 数据库连接
|
3月前
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
41 0
|
3月前
|
存储 Java Go
Go从入门到放弃之结构体(面向对象)
Go从入门到放弃之结构体(面向对象)
|
3月前
|
存储 C语言
指针与结构体
指针与结构体
31 0
|
3月前
|
存储 Go
Go 内存分配:结构体中的优化技巧
Go 内存分配:结构体中的优化技巧