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

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


相关文章
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
2324 13
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
521 4
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
656 4
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
400 1
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
523 2
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
435 1
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
657 1
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
578 1
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
360 1