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

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


相关文章
|
6月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
302 3
|
6月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
340 2
|
10月前
|
存储 JSON JavaScript
[go]byte类型, string 类型, json 类型
本文介绍了Go语言中byte类型的基本概念、特点及用法。byte是8位无符号整数,取值范围为0-255,常用于二进制数据操作,如网络通信和文件读写。文章还详细说明了byte与字符串的转换、遍历byte数据以及与其他类型间的转换。此外,探讨了Go中json.Marshal和json.Unmarshal函数实现[]byte与JSON间的转换,并对比了[]byte与JSON的区别,帮助开发者更好地理解其应用场景与差异。
348 2
|
11月前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
314 15
|
11月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
11月前
|
Go C++
Go语言方法与接收者 -《Go语言实战指南》
本文介绍了 Go 语言中方法的相关概念和用法。方法是绑定到特定类型上的函数,包含值接收者和指针接收者两种形式。值接收者不会改变原始数据,而指针接收者可修改原始数据,且在处理大型结构体时性能更优。文章详细对比了方法与普通函数的区别,并说明了选择指针接收者的原因,如修改原始值、提升性能及保持一致性。此外,Go 支持为任意自定义类型定义方法,不仅限于结构体。最后通过表格总结了方法的核心概念和使用场景。
295 34
|
存储 Cloud Native Java
云原生系列Go语言篇-类型、方法和接口 Part 2
虽然Go并发(在并发一章讲解)是聚光灯下的宠儿,便Go设计中真正的明星是其隐式接口,也是Go中唯一的抽象类型。下面就来学习它的伟大之处。
215 0
|
存储 设计模式 Cloud Native
云原生系列Go语言篇-类型、方法和接口 Part 1
通过前面章节的学习,我们知道Go是一种静态类型语言,包含有内置类型和用户定义类型。和大部分现代编程语言一样,Go允许我们对类型关联方法。它也具备类型抽象,可以编写没有显式实现的方法。
242 0
|
人工智能 Java 编译器
【七天入门Go语言】函数 & 方法 & 接口 | 第三天
目录 1. 函数 2. 方法 3. 接口 最后
278 0
【七天入门Go语言】函数 & 方法 & 接口 | 第三天
|
Go C# Kotlin
Golang方法和接口
在编程语言中,方法和函数的概念需要搞清楚。函数指的是一个封装的代码块,我们可以直接调用它,并返回结果。而方法其实也是一种函数,只不过方法需要和某个对象绑定。
1185 0