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

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/ 下载教程参考&#xff08…...

【每日一题】蓝桥杯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&#xff0…...

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问(完)!如何跑出高投产?

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

每日学术速递3.10

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.RO 1.Diffusion Policy: Visuomotor Policy Learning via Action Diffusion 标题:扩散策略:通过动作扩散进行视觉运动策略学习 作者:Cheng Chi, Si…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...