当前位置: 首页 > news >正文

编程笔记 Golang基础 027 结构体

编程笔记 Golang基础 027 结构体

  • 一、结构体的定义
  • 二、结构体的实例化
    • 1. 直接初始化
    • 2. 使用键值对初始化(即使字段顺序不一致也能正确赋值)
    • 3. 部分初始化(未指定的字段会得到它们类型的零值)
    • 4. 使用var声明和初始化
    • 5. 结构体字面量(常用于函数参数、返回值或赋值)
  • 小结

在Go语言中,结构体(struct)是一种复合数据类型,它允许您组合不同类型的多个字段来表示一个复杂的对象或数据记录。

下面是如何在Go中定义和实例化结构体的详细说明:

一、结构体的定义

结构体的定义使用type关键字和struct关键字来完成,语法如下:

// 定义一个结构体
type StructName struct {Field1 Type1Field2 Type2// ...FieldN TypeN
}

例如,我们可以定义一个表示点的结构体:

type Point struct {X intY int
}

在这个例子中,Point是结构体的名字,XY是该结构体的字段名,它们的数据类型分别为int

二、结构体的实例化

一旦定义了结构体,就可以通过分配内存并初始化字段来创建结构体的实例,即结构体变量。有多种方式可以实例化结构体:

1. 直接初始化

// 直接初始化实例
p := Point{X: 10, Y: 20}

2. 使用键值对初始化(即使字段顺序不一致也能正确赋值)

// 使用键值对初始化
p := Point{Y: 20, X: 10} // 注意字段顺序与定义时不同

3. 部分初始化(未指定的字段会得到它们类型的零值)

// 部分初始化,Y将默认为0
p := Point{X: 10}

4. 使用var声明和初始化

// 使用var声明并初始化
var p Point = Point{X: 10, Y: 20}

或者简写形式:

var p = Point{X: 10, Y: 20} // Go可以推断出p的类型

5. 结构体字面量(常用于函数参数、返回值或赋值)

func processPoint(p Point) {// ...
}// 调用函数时直接传递结构体字面量
processPoint(Point{X: 30, Y: 40})

以上就是Go语言中结构体的定义和实例化的基本操作。

小结

结构体在Go语言中扮演着至关重要的角色,其重要作用体现在以下几个方面:

  1. 数据封装与抽象:

    • 结构体允许将一组相关的数据项(字段)组织在一起,形成一个逻辑单元。这样可以反映现实世界中的实体或概念,比如用户信息、订单详情等。
    • 通过定义结构体类型,开发者可以创建自定义的数据类型,对内部细节进行封装,对外仅暴露需要的接口和方法,实现信息隐藏。
  2. 组合复杂数据类型:

    • 结构体能够包含任意类型的字段,包括其他自定义类型、基本类型甚至是其他结构体,这使得它能够构建出非常复杂的数据结构,满足应用程序各种复杂的业务需求。
  3. 面向对象编程支持:

    • 虽然Go语言不直接支持类和继承,但通过结构体和关联的方法,可以实现面向对象编程风格的设计模式,如组合和行为委托等。
    • 结构体可以拥有方法,这些方法定义了结构体实例的行为,增强了代码的可读性和复用性。
  4. 类型安全:

    • 使用结构体作为参数和返回值时,确保了类型安全,因为每个结构体都有自己的类型签名,避免了不同类型数据之间的混淆。
  5. 协作与通信:

    • 在并发编程中,结构体实例可以通过通道传递给goroutine,用于不同协程之间的协作与通信。
  6. 空结构体的特殊用途:

    • 空结构体struct{}虽然没有字段,但在Go中有多种独特用途,例如作为事件信号、无值占位符(函数参数或map键)、channel元素类型等,用于同步机制或者简化某些API设计。

综上所述,结构体是Go语言中构建复杂程序的重要基石,对于提高代码组织性、模块化以及解决实际问题都具有不可替代的作用。

相关文章:

编程笔记 Golang基础 027 结构体

编程笔记 Golang基础 027 结构体 一、结构体的定义二、结构体的实例化1. 直接初始化2. 使用键值对初始化(即使字段顺序不一致也能正确赋值)3. 部分初始化(未指定的字段会得到它们类型的零值)4. 使用var声明和初始化5. 结构体字面量…...

opencascade15解析导出为step格式

#include "DisplayScene.h" // 包含显示场景的头文件 #include "Viewer.h" // 包含查看器的头文件// OpenCascade 包含 #include <BRepPrimAPI_MakeCylinder.hxx> // 创建圆柱体 #include <BinXCAFDrivers.hxx> // 二进制XCAF驱动程序 #includ…...

【软件设计模式之模板方法模式】

文章目录 前言一、什么是模板方法模式&#xff1f;二、模板方法模式的结构1. 抽象类定义2. 具体实现 三、模板方法模式的应用场景1. 算法重用2. 操作中的固定步骤3. 扩展框架的功能4. 提供回调方法5. 遵循开闭原则 四、模板方法模式的优缺点1. 优点代码复用扩展性好符合开闭原则…...

Spring Boot项目怎么对System.setProperty(key, value)设置的属性进行读取加解密

一、前言 之前我写过一篇文章使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置&#xff08;读取时自动解密&#xff09;&#xff0c;对Spring Boot项目的属性读取时进行加解密&#xff0c;但是没有说明对System.setProperty(key, value)设…...

Linux理解

VMware安装Linux安装 目录 VMware安装Linux安装 1.1 什么是Linux 1.2 为什么要学Linux 1.3 学完Linux能干什么 2.1 主流操作系统 2.2 Linux系统版本 VMware安装Linux安装 1.1 什么是Linux Linux是一套免费使用和自由传播的操作系统。 1.2 为什么要学Linux 1). 企业用人…...

常用芯片学习——YC688语音芯片

YC688 广州语创公司语音芯片 使用说明 YC688是一款工业级的MP3语音芯片 &#xff0c;完美的集成了MP3、WAV的硬解码。支持SPI-Flash、TF卡、U盘三种存储设备。可通过电脑直接更新SPI-Flash的内容&#xff0c;无需上位机软件。通过简单的串口指令即可完成三种存储设备的音频插…...

C语言:指针的进阶讲解

目录 1. 二级指针 1.1 二级指针是什么&#xff1f; 1.2 二级指针的作用 2. 一维数组和二维数组的本质 3. 指针数组 4. 数组指针 5. 函数指针 6. typedef的使用 7. 函数指针数组 7.1 转移表 1. 二级指针 如果了解了一级指针&#xff0c;那二级指针也是可以很好的理解…...

基于SSM的车位租赁系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的车位租赁系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…...

Java pyhon C C++ R JS 主流语言的区别-03

以下是对这几种语言的数据类型进行简要归纳&#xff1a; Java的数据类型&#xff1a; 基本数据类型&#xff1a;包括整数类型&#xff08;byte、short、int、long&#xff09;、浮点数类型&#xff08;float、double&#xff09;、字符类型&#xff08;char&#xff09;和布尔…...

5 buuctf解题

命令执行 [BJDCTF2020]EasySearch1 打开题目 尝试弱口令&#xff0c;发现没有用 扫描一下后台&#xff0c;最后用御剑扫描到了index.php.swp 访问一下得到源码 源码如下 <?phpob_start();function get_hash(){$chars ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu…...

微服务三十五关

1.微服务有什么好处&#xff1f; 微服务优点很多&#xff0c;但是我们通常说一个东西好肯定会跟另一个东西比较&#xff0c; 通常说微服务好会和单体项目进行比较。以下是微服务相对于单体项目的一些显著好处&#xff1a; 首先&#xff0c;让我们讨论单体项目的一些主要缺点&a…...

第一个 Angular 项目 - 添加服务

第一个 Angular 项目 - 添加服务 这里主要用到的内容就是 [Angular 基础] - service 服务 提到的 前置项目在 第一个 Angular 项目 - 动态页面 这里查看 想要实现的功能是简化 shopping-list 和 recipe 之间的跨组件交流 回顾一下项目的结构&#xff1a; ❯ tree src/app/…...

红日靶场3

靶场链接&#xff1a;漏洞详情 在虚拟机的网络编辑器中添加两个仅主机网卡 信息搜集 端口扫描 外网机处于网端192.168.1.0/24中&#xff0c;扫描外网IP端口&#xff0c;开放了80 22 3306端口 80端口http服务&#xff0c;可以尝试登录网页 3306端口mysql服务&#xff0c;可…...

B树的介绍

R-B Tree 简介特性B树特性m阶B树的性质&#xff08;这些性质是B树规定的&#xff09; B树的搜索B树的添加B树的删除——非叶子结点 简介 R-B Tree又称为Red-Black Tree&#xff0c;红黑树。是一种特殊的二叉查找树&#xff0c;红黑树的每个节点上都有存储为表示结点的颜色&…...

《The Art of InnoDB》第二部分|第4章:深入结构-磁盘结构-撕裂的页面(doublewrite buffer)

4.5 撕裂的页面 目录 4.5 撕裂的页面 4.5.1 双写缓冲区的作用 4.5.2 双写缓冲区的结构 4.5.3 双写缓冲区与Redolog的协同工作流程 4.5.2 双写缓冲区写入时机 4.5.3 禁用双写缓冲区 4.5.4 小结 未完待续... 上文我们学习了redo log的结构和其工作原理,它是一个…...

提示工程(Prompt Engineering)、微调(Fine-tuning) 和 嵌入(Embedding)

主要参考资料&#xff1a; 还没搞懂嵌入&#xff08;Embedding&#xff09;、微调&#xff08;Fine-tuning&#xff09;和提示工程&#xff08;Prompt Engineering&#xff09;&#xff1f;: https://blog.csdn.net/DynmicResource/article/details/133638079 B站Up主Nenly同学…...

【Flink精讲】Flink 内存管理

面临的问题 目前&#xff0c; 大数据计算引擎主要用 Java 或是基于 JVM 的编程语言实现的&#xff0c;例如 Apache Hadoop、 Apache Spark、 Apache Drill、 Apache Flink 等。 Java 语言的好处在于程序员不需要太关注底层内存资源的管理&#xff0c;但同样会面临一个问题&…...

正则化概念及使用

正则化概念及使用 正则化概念正则化原理常用的两种正则化方法1. L1 正则化&#xff08;Lasso&#xff09;2. L2 正则化&#xff08;Ridge&#xff09; 正则化参数 正则化概念 在机器学习中&#xff0c;我们致力于通过从训练数据中学习模式或规律来构建模型。为了找到最佳的模型…...

让程序员设计B端界面,好比武大郎招聘:向我看齐。不忍直视!

hello&#xff0c;我是大美B端工场&#xff0c;B端系统的要求越来越高了&#xff0c;很多公司还让程序员负责页面&#xff0c;页面搞的没法看&#xff0c;也怪不得程序员。程序员来搞页面&#xff0c;那还不是武大郎招聘——向我看齐&#xff0c;以我的标准为标准吗&#xff1f…...

使用python构建Android,探索跨平台应用开发Kivy框架

使用python构建Android&#xff0c;探索跨平台应用开发Kivy框架 1. 介绍Kivy框架 Kivy是什么&#xff1f; Kivy是一个开源的Python跨平台应用程序开发框架&#xff0c;旨在帮助开发者快速构建创新的、可扩展的移动应用和多点触控应用。Kivy采用MIT许可证&#xff0c;允许开发…...

AssetRipper终极指南:如何免费快速提取Unity游戏资源

AssetRipper终极指南&#xff1a;如何免费快速提取Unity游戏资源 【免费下载链接】AssetRipper GUI Application to work with engine assets, asset bundles, and serialized files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper AssetRipper是一款强…...

弧形导轨精度等级适配策略

弧形导轨是用于实现曲线运动的线性导向装置&#xff0c;广泛应用于自动化设备、机器人、医疗机械等领域。弧形导轨作为机械传动中的核心部件&#xff0c;其精度等级直接影响设备性能与稳定性。从精密加工到重型机械&#xff0c;不同场景对导轨的制造精度、运行精度及耐磨性要求…...

利用Cosmos-Reason1-7B进行Java面试题智能解析与答案生成

利用Cosmos-Reason1-7B进行Java面试题智能解析与答案生成 最近在帮朋友准备Java面试&#xff0c;发现一个挺普遍的问题&#xff1a;网上的面试题答案要么太零散&#xff0c;要么太浅显&#xff0c;很难找到一个能讲透原理、还能分析源码的深度解析。自己整理吧&#xff0c;费时…...

Claude Code 命令和用法

斜杠命令&#xff08;会话内输入 / 触发&#xff09;会话与导航命令说明/clear清除对话历史&#xff0c;释放上下文。别名&#xff1a;/reset、/new/compact [指令]压缩对话&#xff0c;可附加聚焦指令/resume [会话]恢复历史会话。别名&#xff1a;/continue/rename [名称]重命…...

VSCode本地历史记录插件Local History保姆级教程:从安装到.gitignore配置

VSCode本地历史记录插件Local History深度指南&#xff1a;从高效使用到项目集成 为什么开发者需要本地历史记录功能 在日常开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;修改了一段代码后突然意识到之前的版本可能更好&#xff0c;或者不小心覆盖了重要内容却无法撤…...

继电器触点粘接?手把手教你用NTC热敏电阻搞定大功率负载保护

大功率负载下继电器触点粘接的工程解决方案&#xff1a;NTC热敏电阻实战指南 当你在深夜调试一块电源板时&#xff0c;突然闻到焦糊味——继电器又粘接了。这不是个例&#xff0c;据统计&#xff0c;工业控制系统中约23%的继电器故障源于触点粘接&#xff0c;而大电流场景下这一…...

从噪声到艺术:深入解析扩散模型采样算法的核心步骤

1. 扩散模型&#xff1a;当数学遇见艺术创作 想象一下&#xff0c;你正在看一位画家作画。他一开始只是在画布上随意涂抹颜料&#xff0c;看起来毫无章法。但随着画笔的不断调整&#xff0c;那些混乱的色块逐渐形成了清晰的轮廓&#xff0c;最终变成一幅精美的画作。这正是扩散…...

Hitboxer终极指南:免费开源SOCD清洁工具让游戏操作更丝滑

Hitboxer终极指南&#xff1a;免费开源SOCD清洁工具让游戏操作更丝滑 【免费下载链接】socd SOCD cleaner tool for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 还在为游戏中的方向冲突而烦恼吗&#xff1f;当你在激烈的对战中同时按下左右方向键&a…...

文墨共鸣大模型入门指南:Ubuntu 20.04系统下的保姆级部署教程

文墨共鸣大模型入门指南&#xff1a;Ubuntu 20.04系统下的保姆级部署教程 想试试最近挺火的文墨共鸣大模型&#xff0c;但被复杂的部署步骤劝退了&#xff1f;别担心&#xff0c;这篇教程就是为你准备的。咱们今天不谈复杂的原理&#xff0c;就手把手教你&#xff0c;如何在Ub…...

不只是安装:深入理解TI毫米波雷达开发套件(MMWCAS-RF-EVM)的软件生态与数据流

不只是安装&#xff1a;深入理解TI毫米波雷达开发套件&#xff08;MMWCAS-RF-EVM&#xff09;的软件生态与数据流 毫米波雷达技术正在重塑自动驾驶、工业检测和智能安防等领域&#xff0c;而TI的MMWCAS-RF-EVM评估板作为行业标杆工具&#xff0c;其真正的价值往往被简化为"…...