Go - 9.struct 使用指南

目录

一.引言

二.struct 定义

三.struct 实践

1. 初始化 struct

2. 嵌套 struct

3. func 与 struct

四.struct 进阶

1.Json Tags

2.Other Tags

五.总结


一.引言

在编程中,结构体(struct)是一种聚合数据类型,用于将多个不同类型的值组合在一起。结构体在许多编程语言中都有类似的概念,Go 语言(简称 Go)也不例外。Go 语言中的 struct 提供了一种灵活且高效的方式来组织和管理复杂的数据。本文将详细介绍 Go 语言中的 struct,包括其定义、使用方法以及一些实际应用场景。

二.struct 定义

在 Go 语言中,struct 是一种用户定义的类型,用于将多个字段组合在一起。每个字段都有一个名称和类型。定义结构体的语法如下:

type StructName struct {
    FieldName1 FieldType1
    FieldName2 FieldType2
    // ...
}

其中:

  • StructName 是结构体的名称。
  • FieldName1 和 FieldName2 是字段的名称。
  • FieldType1 和 FieldType2 是字段的类型。

- 示例

package main

import "fmt"

// 定义一个名为 Person 的结构体
type Person struct {
    Name string
    Age  int
}

func main() {
    // 创建一个 Person 类型的实例
    p := Person{Name: "Alice", Age: 30}
    fmt.Println("Name:", p.Name)
    fmt.Println("Age:", p.Age)
}

在这个示例中,我们定义了一个名为 Person 的结构体,它包含两个字段:Name 和 Age。然后,我们创建了一个 Person 类型的实例,并打印其字段值。

三.struct 实践

1. 初始化 struct

结构体可以通过多种方式初始化,包括使用字面量、使用字段名称初始化以及使用 new 函数。

- 使用字面量初始化

p := Person{"Alice", 30}

- 使用字段名初始化

p := Person{Name: "Alice", Age: 30}

- 使用 `new` 方法

p := new(Person)
p.Name = "Alice"
p.Age = 30

2. 嵌套 struct

结构体可以包含其他结构体作为字段,这称为嵌套结构体。以下是一个示例:

package main

import "fmt"

// 定义 Address 结构体
type Address struct {
    City, State string
}

// 定义 Person 结构体,包含 Address 作为字段
type Person struct {
    Name    string
    Age     int
    Address Address
}

func main() {
    // 创建一个 Person 类型的实例
    p := Person{
        Name: "Alice",
        Age:  30,
        Address: Address{
            City:  "New York",
            State: "NY",
        },
    }
    fmt.Println("Name:", p.Name)
    fmt.Println("Age:", p.Age)
    fmt.Println("City:", p.Address.City)
    fmt.Println("State:", p.Address.State)
}

3. func 与 struct

结构体可以有方法,方法是与特定类型关联的函数。以下是一个示例:

package main

import "fmt"

// 定义 Person 结构体
type Person struct {
    Name string
    Age  int
}

// 为 Person 结构体定义一个方法
func (p Person) Greet() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

func main() {
    // 创建一个 Person 类型的实例
    p := Person{Name: "Alice", Age: 30}
    p.Greet()
}

在这个示例中,我们为 Person 结构体定义了一个名为 Greet 的方法,该方法打印一个问候消息。

四.struct 进阶

1.Json Tags

在 Go 语言中,结构体字段后面的反引号(``)部分称为标签(tags)。标签是一个字符串字面量,可以为结构体字段提供额外的元数据。标签通常用于与反射(reflection)一起使用,以便在运行时获取这些元数据。

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

Name 字段后面的标签 json:"name" 是一个 JSON 标签,用于指定在进行 JSON 编码和解码时,结构体字段应映射到的 JSON 键名。

- Tag 的作用

当你使用 encoding/json 包将结构体编码为 JSON 或从 JSON 解码为结构体时,JSON 标签会告诉编码器和解码器如何处理结构体字段。例如:

  • 编码:将结构体转换为 JSON 字符串时,Name 字段会被编码为 name 键。
  • 解码:将 JSON 字符串转换为结构体时,name 键的值会被解码到 Name 字段。

- 举个 🌰

package main

import (
	"encoding/json"
	"fmt"
)

// 定义结构体,并为字段添加 JSON 标签
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	// 创建一个结构体实例
	person := Person{
		Name: "Alice",
		Age:  30,
	}

	// 将结构体编码为 JSON 字符串
	jsonData, err := json.Marshal(person)
	if err != nil {
		fmt.Println("Error encoding JSON:", err)
		return
	}
	fmt.Println("JSON 编码结果:", string(jsonData))

	// 将 JSON 字符串解码为结构体
	jsonString := `{"name": "Bob", "age": 25}`
	var decodedPerson Person
	err = json.Unmarshal([]byte(jsonString), &decodedPerson)
	if err != nil {
		fmt.Println("Error decoding JSON:", err)
		return
	}
	fmt.Printf("JSON 解码结果: %+v\n", decodedPerson)
}

通过 Struct 和 Tags,我们可以快捷的实现 json 与 struct 的互转: 

2.Other Tags

除了 JSON 标签外,Go 语言中还有许多其他常见的标签,例如:

XML 标签:用于 encoding/xml 包。

type Person struct {
    Name  string `xml:"name"`
    Age   int    `xml:"age"`
}

数据库标签:用于与数据库 ORM(如 GORM)一起使用。

type User struct {
    ID   int    `gorm:"primary_key"`
    Name string `gorm:"column:user_name"`
}

验证标签:用于字段验证库(如 go-playground/validator)。

type User struct {
    Email string `validate:"required,email"`
    Age   int    `validate:"gte=0,lte=130"`
}

有兴趣的同学可以搜索自己的数据来源是否有与 Struct 匹配的解 Tag。

五.总结

结构体是 Go 语言中的一种重要数据类型,用于将多个不同类型的值组合在一起。通过使用 struct,我们可以定义复杂的数据结构,并为其添加方法以实现特定的行为。本文介绍了结构体的定义、初始化、嵌套结构体以及方法的使用,希望能帮助你更好地理解和使用 Go 语言中的结构体。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/766882.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文献解读-长读长测序-第十四期|《作为了解棉花驯化的资源,印度棉(Gossypium herbaceum L. Wagad)基因组》

关键词:基因组;长读长测序;棉花基因组; 文献简介 标题(英文):The Gossypium herbaceum L. Wagad genome as a resource for understanding cotton domestication标题(中文&#xff…

【HTML入门】列表与表格

文章目录 前言一、列表与表格是什么?列表表格 二、使用标签列表标签表格标签 三、组合情况列表的组合表格的组合 四、示例代码总结 好的,以下是一个关于HTML列表与表格的文章示例: 前言 随着网页开发的普及,HTML成为了构建网页的…

零基础学习MySQL---MySQL入门

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、什么是数据库 问:存储数据用文件就可以了,为什么还要弄个数据库呢? 这就不得不提…

Java面试八股文

一、Redis 1. 使用场景 (1)Redis的数据持久化策略有哪些 RDB:全称Redis Database Backup file(Redis数据备份文件),也被叫作Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故…

Chapter9 更复杂的光照——Shader入门精要学习笔记

Chapter9 更复杂的光照 一、Unity的渲染路径1.渲染路径的概念2.渲染路径的类型①前向渲染路径a. 前向渲染路径的原理b. Unity中的前向渲染c. 两种Pass ②延迟渲染路径a. 延迟渲染路径的原理b. Unity中的延迟渲染c. 两种Pass ③顶点照明渲染路径 二、Unity的光源类型1.光源类型①…

毫秒级相应逆流检测电表安科瑞防逆流电能表

家庭储能系统 生态环境与人们的日常生活密切相关,越来越多的家庭开始重视居住环境的绿色、环保、智能及可持续性,并采取具体行动。截至2023年,欧洲太阳能发电容量已超200GW,家庭储能系统的安装量呈爆炸性增长。 用户痛点及需求 …

前端基础:JavaaScript(篇二)

目录 内置对象 String字符串 属性 代码 运行 方法 代码 运行 日期 代码 运行 Math 代码 运行 数组 定义 属性 代码 运行 方法 join(分隔符>) : 代码 运行 reverse(): 代码 运行 sort() : 代码 运行 事件 …

有哪些手持小风扇品牌推荐?五大手持小风扇诚意推荐!

在炎炎夏日,一款便携且高效的手持小风扇无疑是消暑的必备神器。为了帮助大家轻松应对酷暑,我们精心挑选了五大手持小风扇品牌进行诚意推荐。这些品牌不仅拥有出色的降温效果,更在外观设计、便携性、续航能力及操作便捷性上表现卓越。接下来&a…

电子邮件OTP验证身份认证接口API服务商比较

电子邮件OTP验证身份认证接口API服务商如何正确选择? 电子邮件OTP验证是一种广泛应用且安全的身份认证方式。AokSend将比较几家主要的电子邮件OTP验证身份认证接口API服务商,帮助企业选择合适的解决方案。 电子邮件OTP:验证优势 可以为用户…

软考高级-系统分析师知识点100条速记!

宝子们!上半年软考已经结束一段时间了,准备备考下半年软考高级-系统分析师的小伙伴可以开始准备了,毕竟高级科目的难度可是不低的,相信参加过上半年系分的小伙伴深有体会。 这里给大家整理了100条系分知识点,涵盖全书9…

【SPIE独立出版】第四届智能交通系统与智慧城市国际学术会议(ITSSC 2024)

第四届智能交通系统与智慧城市国际学术会议(ITSSC 2024)将于2024年8月23-25日在中国西安举行。本次会议主要围绕智能交通、交通新能源、无人驾驶、智慧城市、智能家居、智能生活等研究领域展开讨论, 旨在为该研究领域的专家学者们提供一个分享…

如何在 Java 应用中使用 Jedis 客户端库来实现 Redis 缓存的基本操作

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

【kubernetes】资源调度综合篇,HPA自动扩/缩容等功能

一、标签和选择器 1、标签 命令行操作 # 查看标签 kubectl get [资源类型] [资源名] --show-labels# 修改标签 kubectl label [资源类型] [资源名] [标签名][标签值] --overwrite# 创建标签 kubectl label [资源类型] [资源名] [标签名][标签值]Yalm文件操作 2、选择器 命…

十三、【源码】自动扫描注册Bean

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/13-auto-scan-bean 自动扫描注册Bean 自动扫描Bean流程&#xff1a; 配置文件中配置标签<context:component-scan base-…

数据库管理-第216期 Oracle的高可用-01(20240703)

数据库管理216期 2024-07-03 数据库管理-第216期 Oracle的高可用-01&#xff08;20240703&#xff09;1 MAA简介2 MAA等级2.1 BRONZE2.2 SILVER2.3 GOLD2.4 PLATINUM 3 业务延续性总结 数据库管理-第216期 Oracle的高可用-01&#xff08;20240703&#xff09; 作者&#xff1a;…

巴西市场有哪些电商平台?巴西最畅销的产品有哪些?

巴西&#xff0c;作为南美洲最大的经济体之一&#xff0c;近年来在电子商务领域展现出强劲的增长势头。随着互联网的普及和消费者购物习惯的改变&#xff0c;电商平台在巴西市场上“打”得热火朝天&#xff0c;不过占据市场份额最大的依然还是美客多。本文将探讨巴西市场上的主…

TikTok矩阵管理系统:打造个人品牌的秘密武器

在当今数字化时代&#xff0c;个人品牌的建立对于个人和企业来说都变得至关重要。无论是企业家、自由职业者还是社交媒体个人&#xff0c;都希望能够在竞争激烈的市场中脱颖而出。而TikTok矩阵管理系统正是一个帮助个人打造个人品牌的秘密武器。 TikTok矩阵管理系统是一个集成了…

AI教育行业全景图(最新版);AI时代内容创作者的窘境;2年内AI教育赛道的切入机会;可汗学院创始人「AI教育革命」新书问世 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 可汗学院 (Khan Academy) 创始人新书发布&#xff1a;AI将如何颠覆传统教育 可汗学院&#xff08;Khan Academy&#xff09;是 Salman Khan 创立的…

HiAI Foundation开发平台,加速端侧AI应用的智能革命

如果您是一名开发者&#xff0c;正在寻找一种高效、灵活且易于使用的端侧AI开发框架&#xff0c;那么HarmonyOS SDKHiAI Foundation服务&#xff08;HiAI Foundation Kit&#xff09;就是您的理想选择。 作为一款AI开发框架&#xff0c;HiAI Foundation不仅提供强大的NPU计算能…

c/c++语言的一种日志的编写办法

今日分享一下&#xff0c;从某源码中看到这种日志编写方式&#xff0c;很强。可以借鉴。 这个函数调用的日志函数是不一样的&#xff0c;仔细观看&#xff1a; 这几种日志输出函数&#xff0c;背后都调用了相同的调用。 与之对应的区别就是&#xff0c;函数名称的差异取决于…