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

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


相关文章
|
19天前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
|
25天前
|
算法 Go
Go语言模拟集合类型-《Go语言实战指南》
在 Go 语言中,虽然没有内建的集合(Set)类型,但可以通过 `map` 实现其功能。常用方式包括 `map[T]bool` 和更节省内存的 `map[T]struct{}`。前者以布尔值表示元素存在性,后者利用零内存开销的空结构体。文章介绍了集合的基本操作(添加、删除、判断、遍历),并通过封装示例展示如何创建自定义 Set 类型。这种实现方式适用于去重、唯一标记及集合运算等场景,简洁高效且易于扩展。
|
4月前
|
存储 算法 Go
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。
|
7月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
150 4
|
10月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
19天前
|
存储 安全 IDE
说一说序列化与反序列化中存在的问题
本文详细解析了Java中的序列化机制,包括序列化的概念、实现方式及应用场景。通过Student类的实例演示了对象的序列化与反序列化过程,并分析了`Serializable`接口的作用以及`serialVersionUID`的重要意义。此外,文章还探讨了如何通过自定义`readObject()`方法增强序列化的安全性,以及解决可序列化单例模式中可能产生的多实例问题。最后提供了代码示例和运行结果,帮助读者深入理解序列化的原理与实践技巧。
|
21天前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
7月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
191 1
|
7月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
8月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
下一篇
oss创建bucket