6.3 Go 结构体(Struct)


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • 结构体的定义与初始化
      • 匿名字段
      • 方法与接收者
      • 指针与值接收者
      • 标签(Tag)
      • 嵌入与类型断言
      • 接口实现
      • 结构体比较
      • 结构体的内存对齐
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
在Go语言中,结构体(Struct)是一种复合数据类型,它允许我们将多个不同类型的数据项组合成一个单一的实体。结构体在Go语言中扮演着极其重要的角色,它是面向对象编程中类和对象的替代品。本文将探讨一些中高级的结构体使用技巧,旨在帮助开发者更有效地利用这一强大的特性。

结构体的定义与初始化

结构体可以通过type关键字定义,并通过指定字段名和类型来创建。例如:

type Person struct {Name stringAge  int
}

初始化结构体可以通过指定字段名来完成:

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

或者使用new函数来分配内存,并通过指针访问结构体:

p := new(Person)
p.Name = "Bob"
p.Age = 25

匿名字段

Go语言允许在结构体中使用匿名字段,这使得我们可以在结构体中嵌入其他类型,而无需显式地声明字段名。例如:

type Employee struct {PersonDepartment string
}emp := Employee{Person{Name: "Charlie", Age: 40},Department: "HR",
}

这里,Person作为一个匿名字段被嵌入到Employee结构体中,从而Employee结构体拥有了Person的所有字段。

方法与接收者

在Go中,可以为结构体定义方法,方法是与特定类型相关联的函数。方法的接收者定义了方法属于哪个类型。例如:

func (p *Person) Greet() {fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

这里,Greet方法属于Person类型,接收者是一个指向Person类型的指针。使用指针作为接收者可以允许方法修改接收者变量的状态。

指针与值接收者

选择使用指针还是值作为接收者是一个重要的决策。使用指针接收者可以避免复制整个结构体,这对于大型结构体来说可以节省内存和提高性能。然而,使用值接收者可以保证方法不会修改原始数据,从而提供不可变性。

标签(Tag)

结构体字段可以有标签(Tag),这是一种特殊的字符串,用于存储元数据。标签最常用的场景是JSON编码和解码:

type Config struct {Host     string `json:"host"`Port     int    `json:"port"`Database string `json:"database"`
}func main() {config := Config{Host: "localhost", Port: 5432, Database: "testdb"}jsonData, _ := json.Marshal(config)fmt.Println(string(jsonData))
}

在这个例子中,json标签告诉json.Marshal函数如何将结构体字段映射到JSON对象的键。

嵌入与类型断言

嵌入的结构体可以提供一种类型断言的机制,允许我们访问嵌入类型的方法或字段。例如:

func (e *Employee) FullInfo() {e.Person.Greet() // 调用嵌入的Person结构体的Greet方法fmt.Printf("I work in the %s department.\n", e.Department)
}

这里,Employee结构体嵌入了Person,因此可以通过e.Person访问Person的方法。

接口实现

结构体可以隐式地实现接口,只要它们提供了接口中定义的所有方法。这使得结构体非常灵活,可以轻松地适应不同的接口。例如:

type Greeter interface {Greet()
}func greetAll(greeters []Greeter) {for _, greeter := range greeters {greeter.Greet()}
}func main() {people := []Greeter{&Person{Name: "Dave", Age: 22}, &Employee{Person{Name: "Eve", Age: 23}, Department: "IT"}}greetAll(people)
}

在这个例子中,PersonEmployee都实现了Greeter接口,因为它们都有Greet方法。

结构体比较

Go语言中,只有当两个结构体的所有字段都可比较,并且它们的类型也支持比较操作时,这两个结构体才能进行比较。例如:

type Info struct {Name stringValue int
}func main() {i1 := Info{Name: "X", Value: 42}i2 := Info{Name: "X", Value: 42}fmt.Println(i1 == i2) // 输出:true
}

结构体的内存对齐

Go编译器会自动对结构体的字段进行内存对齐,以优化访问速度。了解这一点对于性能调优非常重要。可以通过unsafe包来查看结构体的内存布局:

import "unsafe"func main() {fmt.Println(unsafe.Sizeof(Person{})) // 输出Person结构体的大小
}

总结

结构体是Go语言中的核心概念之一,它们提供了一种强大的方式来组织和操作数据。通过掌握结构体的定义、初始化、嵌入、方法、标签、接口实现以及内存对齐等技巧,开发者可以编写出更加高效、灵活且可维护的代码。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】初识

一、使用Label显示Hello World 1.ui设计 可以在Qt Designer中拖拽方式进行创建 2.代码方式 在myqwidget.cpp文件中添加下列代码 二、对象树 我们在堆上创建了QLabel类的对象。但是我们没有去delete,这样会产生内存泄漏吗? 答案是不会。label对象会在…

【Docker】学习笔记(超万字图文整理)

前言 再此感谢黑马程序员提供的Docker课程! 什么是Docker?看这一篇干货文章就够了! UPD: 补充更新微服务集群、Docker镜像仓库部分内容 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验(无广告且清爽)&#…

centos7下安装MySQL,Oracle数据库

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 操作系统版本为CentOS 7 使⽤ MySQ…

【Ambari】Docker 安装Ambari 大数据单机版本

目录 一、前期准备 1.1 部署 docker 1.2 部署 docker-compose 1.3 版本说明 二 、镜像构建启动 2.1 系统镜像构建 2.2 安装包源镜像构建 2.3 kdc镜像构建 2.4 集群安装 2.5 容器导出为镜像 三、Ubuntu环境安装测试 3.1 环境准备 3.2 集群容器启动 一、前期准备 1.…

【算法】理解堆排序

堆排序,无疑与堆这种数据结构有关。在了解堆排序之前,我们需要先了解堆的建立与维护方法。 堆 堆(二插堆)可以用一种近似的完全二叉树来表示,该二叉树除了叶子结点之外,其余节点均具有两个子女&#xff0c…

模板-初阶

引言: 在C,我们已经学过了函数重载,这使得同名函数具有多个功能。但是还有一种更省力的方法:采用模板。 本文主要介绍以下内容 1. 泛型编程 2. 函数模板 3. 类模板 1.泛型编程 在将这一部分之前,通过一个故事引…

nginx的配置粗记

小白nginx的配置随笔(随便记记) 前言 我们都知道nginx有很多用途,比如:负载均衡,反向代理,网关路由,解决跨域等问题。我这次开发项目,用到的一些功能也涉及到了对nginx的配置&#…

Vue.js 动态组件与异步组件

title: Vue.js 动态组件与异步组件 date: 2024/6/2 下午9:08:50 updated: 2024/6/2 下午9:08:50 categories: 前端开发 tags:Vue概览动态组件异步加载性能提升路由管理状态控制工具生态 第1章 Vue.js 简介 1.1 Vue.js 概述 Vue.js 是一个渐进式的JavaScript框架,…

MedSAM 学习笔记(续):训练自定义数据集

1、下载官方权重 官方的预训练权重:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth 下载后保存在:work_dir/SAM/sam_vit_b_01ec64.pth 目录 2、摆放数据集 因为MedSAM 分割模型需要对3D数据集进行切片处理,也就是对nii.gz 数据处理成 npy 格式 …

Linux--构建进程池

目录 1.进程池 1.1.我们先完成第一步,创建子进程和信道 1.2. 通过channel控制,发送任务 1.3回收管道和子进程 1.4进行测试 1.5完整代码 1.进程池 进程池其产生原因主要是为了优化大量任务需要多进程完成时频繁创建和删除进程所带来的资源消耗&#…

Mysql(一)查询Sql是如何执行的

Hello,大家好我是极客涛😎,我最近在整理Mysql相关的知识点,所以准备开启一个Mysql的主线任务,大概耗时3周左右,整个节奏还是由浅入深,主要包括Mysql的架构、事务实现、索引组织形式、SQL优化、日…

图解大模型分布式并行各种通信原语

背景 在分布式集群上执行大模型任务时候,往往使用到数据并行,流水线并行,张量并行等技术,这些技术本质上也就是对数据进行各种方案的切分,然后放到不同的节点上运算。不同节点在计算的过程中需要对数据分发或者同步等…

python的一种集成开发工具:PyCharm开发工具

一. 简介 本文简单了解两种 python语言所使用的 集成开发环境: PyCharm、vscode。 python语言学习中,可以任意选中这两个集成开发环境的一种就可以。本文先来简单学习 PyCharm开发工具安装与使用。 二. python的一种集成开发工具:PyChar…

实现Redis和数据库数据同步问题(JAVA代码实现)

这里我用到了Redis当中的发布订阅模式实现(JAVA代码实现) 先看图示 下面为代码实现 首先将RedisMessageListenerContainer交给Spring管理. Configuration public class redisConfig {AutowiredRedisConnectionFactory redisConnectionFactory;AutowiredQualifier("car…

Linux线程:线程分离

目录 一、什么是线程分离 1.1pthread_detach 1.2pthread线程库存在的意义 1.3__thread线程的局部存储 1.4系统调用clone 一、什么是线程分离 1.1pthread_detach 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_joi…

数据标准的制定落地

目录 什么是数据标准 基本定义 目的 数据标准体系分类 从内容层面分类 从管理视角分类 从面向的对象分类 从数据结构的角度分类 数据标准价值 业务价值 技术价值 管理价值 数据标准和数据治理的关系 数据标准在数据治理各项任务中的作用 数据标准与主数据 数据…

车联网安全入门——ICSim模拟器使用

文章目录 车联网安全入门——ISCim模拟器使用介绍主要特点:使用场景: 安装使用捕获can流量candumpcansnifferwiresharkSavvyCAN主要特点:使用场景: 重放can报文cansendSavvyCAN 总结 车联网安全入门——ISCim模拟器使用 &#x1…

LabVIEW步进电机的串口控制方法与实现

本文介绍了在LabVIEW环境中通过串口控制步进电机的方法,涵盖了基本的串口通信原理、硬件连接步骤、LabVIEW编程实现以及注意事项。通过这些方法,用户可以实现对步进电机的精确控制,适用于各种自动化和运动控制应用场景。 步进电机与串口通信…

【刷题(15】普通数组

一 普通数组基础 首先&#xff0c;我们根据下图先了解一下什么是前缀和。 既然我们明白了前缀和是怎么回事&#xff0c;那我们就来看一下我们该怎么输入 先给出答案&#xff0c;然后再给出分析。 答案&#xff1a; for (int i 1; i < n; i ){cin >> a[i];s[i] s…

Pytest框架中用例用例执行常用参数介绍

pytest 支持通过命令行参数来定制测试运行的方式。以下是一些常用的 pytest 执行参数介绍。 学习目录 -q 或 --quiet: 安静模式&#xff0c;只显示进度和摘要 -s : 选项允许在测试的输出中捕获 stdout 和 stderr。 -v : 选项会使 pytest 的输出更加详细。 -k &#xff1a;…