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学习总结笔记

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


相关文章
|
17天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
92 71
|
1月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
1月前
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
41 3
|
1月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
36 4
|
1月前
|
Go
go语言常量的类型
【10月更文挑战第20天】
26 2
|
2月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
89 11
|
3月前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
40 5
|
3月前
|
大数据 Shell Go
GO方法与自定义类型
本文详细介绍了 Go 语言中的自定义数据类型与方法。不同于传统的面向对象编程语言,Go 通过结构体 (`struct`) 和方法 (`method`) 来扩展自定义类型的功能。文章解释了如何定义结构体、创建方法,并探讨了值接收器与指针接收器的区别及应用场景。此外,还介绍了方法的可见性以及接收器的命名惯例。通过具体示例,帮助读者更好地理解和应用这些概念。
|
3月前
|
存储 Go
Go to Learn Go之指针
Go to Learn Go之指针
29 0
|
3月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
下一篇
DataWorks