iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Go Struct结构体如何实现
  • 539
分享到

Go Struct结构体如何实现

2023-07-05 12:07:58 539人浏览 薄情痞子
摘要

本文小编为大家详细介绍“Go Struct结构体如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go Struct结构体如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是结构

本文小编为大家详细介绍“Go Struct结构体如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go Struct结构体如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

什么是结构体

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。(继承,多态,封装)

Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。

1. 基本实例化(方法1)

只有当结构体实例化时,才会真正地分配内存(其实也就是使用new),也就是必须实例化后才能使用结构体的字段。

结构体本身也是一种类型,我们可以像声明内置类型一样使用 var 关键字声明结构体类型。

type person struct { name string city string age int } func main() { var p1 person p1.name = "张三" p1.city = "北京" p1.age = 18fmt.Printf("p1=%v\n", p1) // p1={张三 北京 18}fmt.Printf("p1=%#v\n", p1) // p1=main.person{name:"张三", city:"北京", age:18} }

2. new实例化(方法2)

我们还可以通过使用 new 关键字对结构体进行实例化,得到的是结构体的地址

从打印的结果中我们可以看出 p2 是一个结构体指针。

注意:在 golang 中支持对结构体指针直接使用.来访问结构体的成员。

p2.name = "张三" 其实在底层是 (*p2).name = "张三"

type person struct {name strinGCity stringage int} func main() {    var p2 = new(person)    p2.name = "张三"    p2.age = 20    p2.city = "北京"    fmt.Printf("p2=%#v \n", p2) //p2=&main.person{name:"张三", city:"北京", age:20}}

3. 键值对初始化(方法3 结构体能够使用指针就使用指针)

type person struct {name stringcity stringage int} func main() {    p4 := &person{    name: "zhangsan",    city: "北京",    age: 18,    }    // p4=&main.person{name:"zhangsan", city:"北京", age:18}    fmt.Printf("p4=%#v\n", p4)}

结构体方法和接收者

结构体说明

在 go 语言中,没有类的概念但是可以给类型(结构体,自定义类型)定义方法。所谓方法就是定义了接收者的函数。

Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self。

方法的定义格式如下:

func (接收者变量 接收者类型) 方法名(参数列表) (返回值) {函数体}

结构体方法和接收者

给结构体 Person 定义一个方法打印 Person 的信息

type Person struct {    name string    age int8} func (p Person) printInfo() {    fmt.Printf("姓名:%v 年龄:%v", p.name, p.age) // 姓名:小王子 年龄:25} func main() {    p1 := Person{        name: "小王子",        age: 25,    }    p1.printInfo() // 姓名:小王子 年龄:25}

值类型和指针类型接收者

实例1:给结构体 Person 定义一个方法打印 Person 的信息

值类型的接收者

  • 当方法作用于值类型接收者时,Go 语言会在代码运行时将接收者的值复制一份。

  • 在值类型接收者的方法中可以获取接收者的成员值,但 修改操作只是针对副本 ,无法修改接收者变量本身。

指针类型的接收者

  • 指针类型的接收者由一个结构体的指针组成

  • 由于指针的特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。

  • 这种方式就十分接近于其他语言中面向对象中的 this 或者 self

方法大部分时候是自己处理自己的数据,总结如下:

Go Struct结构体如何实现

encoding-JSON

1. struct与json

比如我们 Golang 要给 App 或者小程序提供 api 接口数据,这个时候就需要涉及到结构体和Json 之间的相互转换。

  • GolangJSON 序列化是指把结构体数据转化成 JSON 格式的字符串

  • Golang JSON 的反序列化是指把 JSON 数据转化成 Golang 中的结构体对象

  • Golang 中 的 序 列 化 和 反 序 列 化 主 要 通 过 "encoding/json" 包 中 的 json.Marshal() 和json.Unmarshal()方法实现

struct转Json字符串

type Student struct {ID intGender stringname string //私有属性不能被 json 包访问Sno string} func main() { var s1 = Student{    ID: 1,    Gender: "男",    name: "李四",    Sno: "s0001",} fmt.Printf("%#v\n", s1) // main.Student{ID:1, Gender:"男", name:"李四",Sno:"s0001"}var s, _ = json.Marshal(s1)jsonStr := string(s)fmt.Println(jsonStr) // {"ID":1,"Gender":"男","Sno":"s0001"}}

Json字符串转struct

type Student struct {ID intGender stringName stringSno string} func main() {    var jsonStr = `{"ID":1,"Gender":"男","Name":"李四","Sno":"s0001"}`    var student Student //定义一个 Monster 实例    err := json.Unmarshal([]byte(jsonStr), &student)    if err != nil {    fmt.Printf("unmarshal err=%v\n", err)} // 反序列化后 student=main.Student{ID:1, Gender:"男", Name:"李四", Sno:"s0001"}student.Name="张三"fmt.Printf("反序列化后 student=%#v student.Name=%v \n", student, student.Name)}

2. struct tag

1)Tag标签说明

  • Tag 是结构体的元信息,可以在运行的时候通过反射的机制读取出来。

  • Tag 在结构体字段的后方定义,由一对反引号包裹起来

具体的格式如下:

key1:"value1" key2:"value2"

  • 结构体 tag 由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。

  • 同一个结构体字段可以设置多个键值对 tag,不同的键值对之间使用空格分隔。

注意事项:

为结构体编写 Tag 时,必须严格遵守键值对的规则。

结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。例如不要在 key 和 value 之间添加空格。

Tag结构体转化Json字符串

type Student struct {ID int `json:"id"` //通过指定 tag 实现 json 序列化该字段时的 key(表示在做json操作的时候,用json指定的字段名)Gender string `json:"gender"`Name stringSno string} func main() {    var s1 = Student{    ID: 1,    Gender: "男",    Name: "李四",    Sno: "s0001",} // main.Student{ID:1, Gender:"男", Name:"李四", Sno:"s0001"}fmt.Printf("%#v\n", s1)var s, _ = json.Marshal(s1)jsonStr := string(s)fmt.Println(jsonStr) // {"id":1,"gender":"男","Name":"李四","Sno":"s0001"}}

Json字符串转成Tag结构体

type Student struct {    ID int `json:"id"` //通过指定 tag 实现 json 序列化该字段时的 key    Gender string `json:"gender"`    Name string    Sno string} func main() {    var s2 Student    var str = `{"id":1,"gender":"男","Name":"李四","Sno":"s0001"}`    err := json.Unmarshal([]byte(str), &s2)    if err != nil {    fmt.Println(err)    }    // main.Student{ID:1, Gender:"男", Name:"李四", Sno:"s0001"}    fmt.Printf("%#v", s2)}

读到这里,这篇“Go Struct结构体如何实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Go Struct结构体如何实现

本文链接: https://www.lsjlt.com/news/351693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go Struct结构体如何实现
    本文小编为大家详细介绍“Go Struct结构体如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go Struct结构体如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是结构...
    99+
    2023-07-05
  • Go语言中的Struct结构体
    一、Struct结构体 Go语言中没有像C#、Java一样的Class,只有Struct这样的结构体。Go语言使用type关键字来定义一个类型。 如下: type User stru...
    99+
    2024-04-02
  • Go空结构体struct{}的作用是什么
    目录前言作用使用场景实现集合类型实现空通道实现方法接收者总结前言 通过这篇文章《浅谈Go结构体的基本使用》,我们初步认识了空结构体,使用unsafe.SizeOf()方法,明确知道了...
    99+
    2023-02-16
    Go空结构体struct{} Go空结构体 Go struct{}
  • Go语言中的Struct结构体怎么声明
    这篇文章主要介绍了Go语言中的Struct结构体怎么声明的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中的Struct结构体怎么声明文章都会有所收获,下面我们一起来看看吧。一、Struct结构体Go语言...
    99+
    2023-07-02
  • Go语言结构体struct详解,Go空结构体的这些妙用你知道吗?
    本文详解了Go语言结构体的各个知识点,最后介绍了空结构体的3种妙用。希望对你有帮助。 定义 结构体,是一种自定义的数据类型,由多个数据类型组合而成。用于描述一类事物相关属性。 定义方式: typ...
    99+
    2023-09-07
    golang java 算法
  • go语言string转结构体如何实现
    这篇“go语言string转结构体如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言string转结构体如何实现...
    99+
    2023-07-05
  • C语言struct结构体介绍
    目录structstruct的嵌套实验struct C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。 下面是st...
    99+
    2024-04-02
  • C语言结构体struct详解
    目录结构体的概念结构体类型的声明结构体变量的创建typedef关键字结构体的嵌套结构体变量的初始化结构体成员的访问结构体的传参总结结构体的概念 结构体是由一系列具有相同类型或不同类型...
    99+
    2024-04-02
  • C++的结构体struct怎么用
    这篇文章主要讲解了“C++的结构体struct怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++的结构体struct怎么用”吧!struct 结构体占用空间在C++ 中空结构体占1个...
    99+
    2023-06-29
  • C++ Struct结构体怎么使用
    今天小编给大家分享一下C++ Struct结构体怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一.C语言 ...
    99+
    2023-07-05
  • C++Struct结构体用法浅析
    目录一.C语言 Strcut基本用法二.C++Strcut基本用法三.typedef 定义结构体一.C语言 Strcut基本用法 C语言声明结构体的几种方式 struct 结构体名{...
    99+
    2023-05-13
    C++ Struct结构体 C++ Struct用法
  • Go 通过结构struct实现接口interface的问题
    目录一、通过结构(struct) 实现 接口(interface)二、代码示例一、通过结构(struct) 实现 接口(interface) 1、在了解iris框架的时候,经常看到有...
    99+
    2024-04-02
  • golang 学习之路之 struct 结构体
    运维,越做越会遇到瓶颈,网络,存储,操作系统,中间件,数据库,缓存数据库,日志收集,日志监控,工作流,虚拟机,云平台,容器平台,哪一个做成专家都不是一件易事,况且现在运维还得懂开发,会看开发bug,会自己整脚本,python,golang,...
    99+
    2023-06-04
  • Go 结构体
    现在有一个需求,要求存储学生的详细信息,例如,学生的学号,学生的姓名,年龄,家庭住址等。按照以前学习的存储方式,可以以如下的方式进行存储: 通过定义变量的信息,进行存储。但是这种方式,比较麻烦,并且不利于数据的管理。 在GO语言中,我们可...
    99+
    2023-08-30
    golang 开发语言 后端
  • go json转结构体怎么实现
    要将JSON转换为结构体,可以使用encoding/json包提供的Unmarshal函数。以下是一个简单的示例: package ...
    99+
    2024-02-29
    go json
  • Go 结构体序列化的实现
    目录更改JSON对象中的键在JSON对象中隐藏结构体字段附加内容结构体标签string指令本文,我们将回到之前写的showMovieHandler方法,并更新它以返回一个JSON响应...
    99+
    2024-04-02
  • C语言之结构体(struct)详解
    目录为什么需要引入结构体struct定义typedef与#define结构体变量初始化及成员访问结构体访问总结为什么需要引入结构体 原有的数据类型不能满足需求,因此才设计了构造类型结...
    99+
    2024-04-02
  • Golang如何实现Json转结构体
    这篇文章主要讲解了“Golang如何实现Json转结构体”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang如何实现Json转结构体”吧!请求Zabbix API,通过itemid获取...
    99+
    2023-07-05
  • go语言string转结构体的实现
    在 Go 语言中,可以使用标准库中的 encoding/json 包将 JSON 格式的字符串转换为结构体。 假设有以下 JSON 字符串: { "name": "鸡哥", ...
    99+
    2023-03-19
    go语言string转结构体 go string 结构体
  • c# 如何使用结构体实现共用体
    目录理解 C 语言的共用体使用 C# 实现共用体共用体作为另一个共用体的成员在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作