Go: struct 结构体类型和指针【学习笔记记录】
struct 结构体类型和指针
- struct 结构体类型
- 1. 定义结构体
- 2. 访问结构体成员
- 3. 结构体的使用及匿名字段
- 指针
- 1. 指针变量的声明及使用
- 2. 指针数组的定义及使用
- 3. 函数传参修改值
struct 结构体类型
Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
结构体表示一项记录,比如所有的学生可以看作是一个结构体,每个学生包含,姓名,性别,年龄,学号…的属性。
1. 定义结构体
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。
type 结构体名 struct {// 成员变量成员变量名 数据类型
}
2. 访问结构体成员
在Go中访问结构体成员,也是通过 ”结构体.成员变量名“ 的方式来访问。
结构体.成员名
例如创建一个学生结构体,然后对其进行初始化赋值,接着打印出对应结构体的详细信息
package mainimport "fmt"// 结构体的使用// 1.struct 指明结构体类型 ,type 指明 数据类型
type student struct {name stringsex stringage intsid int
}func main() {// 结构体对象创建格式var st1 = student{}st2 := student{}printSt(st1)printSt(st2)// 赋值初始化st1.sex = "男"st1.name = "黄飞鸿"st1.age = 18st1.sid = 2020040413// 赋值初始化st2.sex = "男"st2.name = "叶问"st2.age = 18st2.sid = 2020040414printSt(st1)printSt(st2)// 声明并且同时赋值初始化var st4 = student{name: "李四", age: 22, sex: "男", sid: 2020040415}st5 := student{name: "张三", age: 22, sex: "男", sid: 2020040416}printSt(st4)printSt(st5)
}// 打印结构体成员的函数
func printSt(st student) {fmt.Printf("学生信息:姓名%v\t,性别:%v\t,年龄:%d\t,学号:%d\t\n",st.name, st.sex, st.age, st.sid)
}
运行输出如下:
学生信息:姓名 ,性别: ,年龄:0 ,学号:0
学生信息:姓名 ,性别: ,年龄:0 ,学号:0
学生信息:姓名黄飞鸿 ,性别:男 ,年龄:18 ,学号:2020040413
学生信息:姓名叶问 ,性别:男 ,年龄:18 ,学号:2020040414
学生信息:姓名李四 ,性别:男 ,年龄:22 ,学号:2020040415
学生信息:姓名张三 ,性别:男 ,年龄:22 ,学号:2020040416
这里只是简单的单个结构体的使用,一般我们都使用结构体嵌套的方式,以更好的对实体进行描述。
3. 结构体的使用及匿名字段
Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段(在上面的方式中,结构体成员变量名与数据类型一一对应)。
比如,创建一个People的结构体,然后People是一个很大的范围,学生是其中的一个结构体。
package mainimport "fmt"type People struct{name stringsex stringage int
}type Student struct{People // 匿名字段的使用,只写数据类型,不写字段名sid int
}func main() {var st1 = Student{People{name: "叶问", sex: "男", age: 23}, 10001}printSt(st1)
}func printSt(st Student) {fmt.Printf("学生信息:姓名%v\t,性别:%v\t,年龄:%d\t,学号:%d\t\n",st.name, st.sex, st.age, st.sid)
}
当然,在结构体中其他的普通字段也可以使用匿名字段
在复合结构体中,若存在相同名称的字段,优先访问外层结构体的重名字段,若是想访问内层的重名字段,则需要以内层结构体.成员变量的方式来访问。
type people struct {name string sex string
}
type student struct {people name stringsid int
}
访问外部的重名成员字段
结构体.成员变量字段
访问内部的重名成员字段
结构体.内嵌结构体.成员变量字段
例如下面的例子:
// 创建一个struct结构体
var st1 = student{people{"张三","男"},"李四",10001}
// 访问外部重名成员字段
print(st1.name) // 李四
print(st1.people.name) //张三
指针
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
一个指针变量指向了一个值的内存地址。类似于变量和常量,在使用指针前需要声明指针。
1. 指针变量的声明及使用
指针变量声明的格式如下:
var 指针名 *数据类型
指针使用流程:
- 定义指针变量。
- 为指针变量赋值。
- 访问指针变量中指向地址的值。
在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。
使用如下:
package mainfunc main() {var a = 10println(a) // 10var p *int// 将指针p指向变量ap = &a// 对指针p指向的值进行更改,a的值也会发生更改*p = 11println(a) // 11println(*p) // 11
}
2. 指针数组的定义及使用
指针数组的声明定义格式:
var 指针数组名 [size] *数据类型
与指针变量声明格式基本一致,只是指针数组多了数组长度。
// 定义一个整型数组,然后使用指针数组分别指向里面的每个数组元素
var numbers = []int {11,22,33}
var ptrs [3]*int
for i:= range numbers{ptrs[i] = &numbers[i]
}
for j:= range ptrs{println(*ptrs[j])
}
// 11
// 22
// 33
3. 函数传参修改值
还是指针的特性,直接指向值。函数传参修改值,其实就是在调用函数时,传入地址即可。
比如,一个交换两个变量的值
package mainimport "fmt"func main() {var a int = 10var b int = 20fmt.Printf("a:%d\t,b:%d\t\n", a, b)swap(&a, &b)fmt.Printf("a:%d\t,b:%d\t\n", a, b)
}func swap(ptr1 *int, ptr2 *int) {var temp inttemp = *ptr1*ptr1 = *ptr2*ptr2 = temp
}
// a:10 ,b:20
// a:20 ,b:10
相关文章:
Go: struct 结构体类型和指针【学习笔记记录】
struct 结构体类型和指针struct 结构体类型1. 定义结构体2. 访问结构体成员3. 结构体的使用及匿名字段指针1. 指针变量的声明及使用2. 指针数组的定义及使用3. 函数传参修改值struct 结构体类型 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项…...

量化派递交上市申请,数字经济风口上开启“狂飙”模式
今年全国两会,代表委员们纷纷围绕“中小企业数字化转型”建言献策。如全国政协委员、甘肃省工业和信息化厅副厅长黄宝荣建议,在工业领域加快数字经济立法,支撑中小企业数字化转型;全国政协委员、中国财政科学研究院院长刘尚希建议…...
Linux:IO接口
目录系统调用接口文件描述符一、open二、write三、read四、lseek五、close之前介绍了IO库函数,本文主要介绍系统提供的IO接口,与IO库函数搭配食用效果更佳。 系统调用接口 常使用的IO系统调用接口如下: 接口作用open打开指定的文件write向指…...

cron表达式?
简单理解corn表达式:在使用定时调度任务的时候,我们最常用的,就是cron表达式了。通过cron表达式来指定任务在某个时间点或者周期性的执行。cron表达式配置起来简洁方便,无论是Spring的Scheduled还是用Quartz框架,都支持…...

日常任务开发系统
简介 要求 1、人员信息管理:姓名、性别、出生年月、职称、学位、学习或承担的课 2、任务发布模块: 1)任务信息至少需包含:任务名称、任务类型、任务开始时间、任务截至时间、任务需要的人数、任务分值,是否需要提交任务成果等字段 2)可指定任务申领人…...

SQLMap安装教程
注意:在python3环境下安装sqlmap的时候会提示需要在python2的环境下才能安装,其实在python3.6以后也都支持sqlmap了。 sqlmap安装步骤: 一、下载python; 下载地址 https://www.python.org/downloads/ 下载教程参考(…...
【每日一题】蓝桥杯Day06
文章目录一、星期计算1、问题描述2、思路解析3、AC代码4、代码解析二、考勤刷卡1、问题描述2、解题思路3、AC代码4、代码解析5、算法分析三、卡片1、问题描述2、解题思路3、AC代码4、代码解析5、算法分析一、星期计算 原题链接:星期计算 1、问题描述 本题为填空题&a…...

实体店创业项目 - 开个网咖需要投入多少钱?主要有哪些费用?
创业开个网咖需求投入的资金主要包括场所租金、装饰费用、设备费用、人员薪酬、水电费用等。详细投入多少钱,需求依据不同区域的市场情况和经营策略来确定。一般来说,开一家中等规划的网咖需求投入10万元以上的资金。 主要有哪些费用? 场所租…...

Linux基础命令-ss显示socket信息
Linux基础命令-netstat显示网络状态 ss 一. 命令介绍 先使用手册查看命令介绍信息 NAME ss - another utility to investigate sockets DESCRIPTION ss is used to dump socket statistics. It allows showing information similar to netstat. It can display more TCP and …...

用一个例子告诉你 怎样在spark中创建累加器
目录 1.说明 1.1 什么是累加器 1.2 累加器的功能 2. 使用累加器 3. 累加器和reduce、fold算子的区别 1.说明 1.1 什么是累加器 累加器是Spark提供的一个共享变量(Shared Variables) 默认情况下,如果Executor节点上使用到了Driver端定义的变量(通过算子传…...
ICG-Avidin,吲哚菁绿标记的亲和素,应用:生物成像、生物检测、免疫组织化学、微阵列检测制备纳米胶束或微球或其他纳米粒子装载ICG实现成像。
ICG-Avidin,吲哚菁绿标记的亲和素 中文名称:吲哚菁绿标记的亲和素 英文名称:ICG-Avidin 激发发射波长:785/821nm 性状:绿色粉末 溶剂:水,部分常规有机溶剂 稳定性:-20℃下干燥避光 应用&…...

Promise的理解和使用
Promise是什么 抽象表达 promise 是一门新的技术(ES6规范)Promise 是JS中进行异步编程的新解决方案 具体表达 从语法上来说:Promise是一个构造函数从功能上来说:promise对象用来封装一个异步操作并可以获取其成功/失败的结果 回调函数就…...

TCP
TCP 流量控制 一般来说,我们希望数据传输的快一些,但如果对方把数据发送的过快,接收方就可能来不及接收,这就会造成数据的丢失 流量控制就是让发送方的发送速率不要太快,让接收方来得及接收 利用滑动窗口机制可以在TCP连接上实现对发送方的流量控制 TCP接收方利用自己的接收…...

Python每日一练(20230310)
目录 1. 爬楼梯 ★ 2. 删除无效的括号 ★★★ 3. 给表达式添加运算符 ★★★ 🌟 每日一练刷题专栏 C/C 每日一练 专栏 Python 每日一练 专栏 1. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方…...
LeetCode-1590. 使数组和能被 P 整除【前缀和,哈希表】
LeetCode-1590. 使数组和能被 P 整除【前缀和,哈希表】题目描述:解题思路一:前缀和,具体看注释。解题思路二:在遍历过程中计算前缀和解题思路三:0题目描述: 给你一个正整数数组 nums࿰…...
Java核心类库
Java核心类库类Math(☆☆☆)System(☆☆☆)Object(☆☆☆☆)Objects (☆)BigDecimal(☆☆☆☆)基本类型的包装类(☆☆☆☆☆)算法(☆☆☆☆☆)二分查找冒泡排序递归Arrays(☆☆☆☆)Date (☆☆☆☆☆)SimpleDateFormat(☆☆☆☆☆)LocalDateTime (☆)Throwable 类(☆☆☆☆)Str…...

1110道Java面试题及答案(最新Java初级面试题大汇总)
开篇小叙 现在 Java 面试可以说是老生常谈的一个问题了,确实也是这么回事。面试题、面试宝典、面试手册......各种 Java 面试题一搜一大把,根本看不完,也看不过来,而且每份面试资料也都觉得 Nice,然后就开启了收藏之路…...

DML 添加、修改、删除数据
目录 DML 一、添加数据 1、给指定字段添加数据 2、给全部字段添加数据 3、批量添加数据 二、修改数据 三、删除数据 DML DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。 一、添加数据 1、给指定字…...

千川投放50问(完)!如何跑出高投产?
第四十一问:计划初期成本很高,是否要关掉重新跑?首先看一下是不是初期回传延迟导致的成本偏高。如果成本没有高的,不建议暂停,先观察一段时间数据,给它一点学习时间。当系统积累过足够的模型之后࿰…...

每日学术速递3.10
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.RO 1.Diffusion Policy: Visuomotor Policy Learning via Action Diffusion 标题:扩散策略:通过动作扩散进行视觉运动策略学习 作者:Cheng Chi, Si…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...