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

【30天熟悉Go语言】6 Go 复杂数据类型之指针

文章目录

  • 一、前言
  • 二、数据类型总览
  • 三、指针
    • 1、特殊运算符& *
    • 2、内存角度来看指针
    • 3、使用指针修改数据
    • 4、指针使用的注意事项
    • 5、对比着看Java的引用类型
  • 三、总结

一、前言

在这里插入图片描述

Go系列文章:

  1. GO开篇:手握Java走进Golang的世界
  2. 2 Go开发环境搭建、Hello World程序运行
  3. 3 Go编程规约和API包
  4. 4 Go的变量、常量、运算符
  5. 5 Go 基本数据类型

Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html

二、数据类型总览

在这里插入图片描述

三、指针

和 C/C++ 中的指针不同,Go中的指针不能进行偏移和运算。它是一种类型指针,可以用于传递数据、对数据进行修改。

简单一点理解:一个指针类型的变量其实就是一个值的内存地址,我们可以通过这个变量的地址(指针)去访问 / 操作数据。

使用指针获取变量内存地址的语法格式:

ptr := &v
  • v 是被取内存地址的变量;
  • 变量ptr的类型为*T,即T的指针类型,*代表指针;变量ptr用于接收变量v的内存地址。
  • 基本数据类型(又叫值类型),都有对应的指针类型,形式为*数据类型
    • 比如:int的对应的指针为*intfloat32对应的指针类型为*float32,依次类推…

1、特殊运算符& *

在Go中 & 和 * 有特殊的用意:

  • & :返回变量的存储地址
  • *:指针取值,取指针变量对应的数值
func main() {var age int = 18fmt.Println("age对应的存储空间内存地址为:",&age)// 指针变量 ptr,指向age在存储空间的内存地址var ptr *int = &age// 指针变量的类型fmt.Printf("ptr类型为: %T\n", ptr)// ptr指向的内存地址fmt.Printf("ptr指向的内存地址为:%p\n", ptr)// ptr变量自身的内存地址fmt.Println("ptr变量自身存储的内存地址为:", &ptr)// 指针取值value := *ptrfmt.Println("ptr这个指针指向的具体数值为:", value)// 取值后的类型fmt.Printf("value type: %T \n", value)
}

控制台输出如下:
在这里插入图片描述

  • 变量ptr的类型为*int
  • ptr指针变量的值为指针地址(16进制的整数);
  • ptr的指针地址,为变量age的内存地址(0xc0000a6058);
  • ptr变量本身也需要一个内存地址(0xc0000ca020)进行存储
  • ptr变量的指针取值操作,获取到的值和类型为变量age的值和类型。

2、内存角度来看指针

普通变量:
在这里插入图片描述

使用var age int = 18声明一个age变量之后,实际在内存中为age变量开辟了一块空间,并且这个空间中存储的数值时18,内存空间会有一个唯一标识(内存地址)。

指针变量:

// 指针变量 ptr,指向age在存储空间的内存地址
var ptr *int = &age// ptr指向的内存地址
fmt.Printf("ptr指向的内存地址为:%p\n", ptr)// ptr变量自身的内存地址
fmt.Println("ptr变量自身存储的内存地址为:", &ptr)

在这里插入图片描述

使用var ptr *int = &age声明一个ptr指针变量之后,实际在内存中也为ptr变量开辟了一块空间,并且这个空间中存储的数值为age变量的内存地址(0xc0000a6058);ptr变临港在内存空间也会有一个唯一标识(内存地址:0xc0000ca020)。

3、使用指针修改数据

指针不只可以用来取值,也可以使用来修改值

var num int = 10
fmt.Println(num)
var ptr *int = &num
*ptr = 20
fmt.Println(num)

控制台输出:
在这里插入图片描述

上面介绍了*ptr为指针取值,这里呢,*ptr = ?则直接用于指针赋值,即修改指针地址的数据内容。

4、指针使用的注意事项

1> 指针变量接收的一定是地址值

// 这种方式不允许
var prt *int = num

2> 指针变量类型和相应数据的类型不可以不匹配

var num int = 10
fmt.Println(num)
// 这种方式不允许,ptr指针的类型应该为*int
var ptr *float32 = &num

解释:*float32 意味着指针指向的是float32类型的数据,但是&num对应的是int类型的数据,所以不可以这样操作。

5、对比着看Java的引用类型

Java也是按值传递,但针对引用类型,方法之间传递引用类型的变量实际传递的是变量的内存地址,通过这个变量我们可以直接操作相应类型在内存中的数据;

以下面的代码为例,在method b中修改了变量variable 的某一块数据,在method b 的上层方法method a中也是有感知的,因为它们共享同一块内存地址的数据。

public class Main {public static void main(String[] args) {a();}public static void a() {ClassA variable = new ClassA(18, "saint");System.out.println("进入method b 方法前:" + variable.toString());System.out.println("method a 中variable内存地址为:" + variable.hashCode());b(variable);System.out.println("进入method b 方法后:" + variable.toString());}public static void b(ClassA variable) {System.out.println("method b 中variable内存地址为:" + variable.hashCode());variable.setAge(28);}@Data@ToStringstatic class ClassA {private Integer age;private String name;public ClassA() {}public ClassA(Integer age, String name) {this.age = age;this.name = name;}}
}

控制台输出:
在这里插入图片描述

如果在method b 中对变量variable进行了整体的重新赋值,则变量variable在method b中内存地址发生改变,与method b 上层方法method a中的内存地址不同了。即:它们不在共享同一块内存地址的数据,在method b中修改variable内部的值不会影响method a中的variable变量的数据。

public static void b(ClassA variable) {variable = new ClassA();System.out.println("method b 中variable内存地址为:" + variable.hashCode());variable.setAge(28);
}

在这里插入图片描述
在这里插入图片描述
从方法执行的堆栈信息来看,在method a中variable的内存地址为510,在method b中variable的内存地址为505。

三、总结

指针呢就是内存地址,类比理解为java中的引用类型。额外再记忆两个运算符、一个公式。

两个运算符:

  • & :取变量的存储地址
  • *:指针取值,取指针变量对应的数值

一个公式:

  • ptr := &v
    • v 是被取内存地址的变量;
    • 变量ptr用于接收变量v的内存地址。
    • 基本数据类型(又叫值类型),都有对应的指针类型,形式为*数据类型,比如:int的对应的指针为*int

相关文章:

【30天熟悉Go语言】6 Go 复杂数据类型之指针

文章目录 一、前言二、数据类型总览三、指针1、特殊运算符& *2、内存角度来看指针3、使用指针修改数据4、指针使用的注意事项5、对比着看Java的引用类型 三、总结 一、前言 Go系列文章: GO开篇:手握Java走进Golang的世界2 Go开发环境搭建、Hello Wor…...

Linux内核使用红黑树的场景

进程调度队列 (Process Scheduling):内核需要对进程按照一定的调度策略进行排队,以便更好地利用 CPU 的时间片。因此,内核使用红黑树作为查找和管理进程调度队列的数据结构,以支持快速的查找、插入和删除操作。 文件系统 (File S…...

遗留的 AppSec 工具迷失在云端

随着应用程序开发步伐的加快,IT 和安全团队正在对旧的应用程序安全(AppSec) 工具失去信心。 根据 Backslash 对 300 名 CISO、AppSec 经理和工程师的调查,遗留工具无法跟上并陷入永远的追赶游戏。 影响是深远的,大多数组织都看到云原生 App…...

直流稳压电源与信号产生电路(模电速成)

目录 一、直流稳压电源 1、直流稳压电路 2、串联型稳压电路 3、集成稳压电路 二、信号产生电路 1、振荡电路 2、波形发生器 一、直流稳压电源 1、直流稳压电路 直流电源由 变压器、整流、滤波、稳压 四部分组成 整流:将交流变为直流 滤波:减小…...

0202性能分析-索引-MySQL

1 索引语法 创建索引 CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_column_name,...);Index_name:规范为idx_表名_字段名... 查看索引 SHOW INDEX FROM table_name;删除索引 DROP INDEX index_name ON table_name;按照下列要求,创建…...

Play wright自动化测试工具该如何更加完美地使用

目录 1.1 拦截网络请求 1.2 pytest 管理用例 1.3 PO模型 1.4 API 和 UI 自动化测试融合 1.5 数据驱动 1.6 动态挑选用例执行 1.6 Allure测试报告 1.7 持续集成 1.1 拦截网络请求 网络拦截: 无响应 pass 中止 route.abort("aborted") 放行 route…...

数据可视化学习笔记:Python实现汽车品牌销售量矩形树图

引言 本文将介绍如何使用 Python 和 Pyecharts 库创建一个汽车品牌销售量的矩形树图。我们将使用 Pandas 读取 CSV 文件数据,然后对数据进行处理、封装,最后将数据可视化为矩形树图。 准备工作 首先,我们需要先安装好相关库: PandasPyecharts可以使用 pip 命令进行安装:…...

【深蓝学院】手写VIO第3章--基于优化的 IMU 与视觉信息融合--作业

0. 题目 1. T1 T1.1 绘制阻尼因子曲线 将尝试次数和lambda保存为csv,绘制成曲线如下图 iter, lambda 1, 0.002000 2, 0.008000 3, 0.064000 4, 1.024000 5, 32.768000 6, 2097.152000 7, 699.050667 8, 1398.101333 9, 5592.405333 10, 1864.135111 11, 1242.7567…...

企业级信息系统开发讲课笔记4.11 Spring Boot中Spring MVC的整合支持

文章目录 零、学习目标一、Spring MVC 自动配置(一)自动配置概述(二)Spring Boot整合Spring MVC 的自动化配置功能特性 二、Spring MVC 功能拓展实现(一)创建Spring Boot项目 - SpringMvcDemo2021&#xff…...

chatgpt赋能python:Python安装EGG——一个简单的指南

Python安装EGG——一个简单的指南 如果你使用Python有一段时间了,你可能会遇到需要安装扩展包(Package)的情况。在Python中,这些扩展包的文件格式通常是.egg(Easy Installable GZip)。在本文中&#xff0c…...

Web前端-React学习

React基础 React 概述 React 是一个用于构建用户界面的JavaScript库。 用户界面: HTML页面(前端) React主要用来写HTML页面, 或构建Web应用 如果从MVC的角度来看,React仅仅是视图层(V),也就…...

【Rust项目实战】sensleak,扫描 Git 仓库中的敏感信息

github仓库:https://github.com/open-rust-initiative/sensleak-rs Rust是一门神奇的编程语言,它提供了内存安全、零成本抽象、并发安全等特性,使开发人员能够编写高性能、高抽象和安全的代码。 这是我用rust开发的第一个工作,希望…...

搭建一个定制版New Bing吧

项目介绍 项目地址:https://github.com/adams549659584/go-proxy-bingai 引用项目简介:用 Vue3 和 Go 搭建的微软 New Bing 演示站点,拥有一致的 UI 体验,支持 ChatGPT 提示词,国内可用,国内可用&#xff…...

使用AIGC工具提升论文阅读效率

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

本周大新闻|Vision Pro头显重磅发布;苹果收购AR厂商Mira

本周XR大新闻,上周Quest 3发布之后,本周苹果MR头显Vision Pro正式发布,也是本周AR/VR新闻的重头戏。 ​AR方面,苹果发布VST头显Vision Pro(虽然本质是台VR,但以AR场景为核心)以及visionOS&…...

在Spring Boot微服务使用JedisCluster操作Redis集群String字符串

记录&#xff1a;449 场景&#xff1a;在Spring Boot微服务使用JedisCluster操作Redis集群的String字符串数据类型。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3,redis-6.2.5,jedis-3.7.1。 1.微服务中配置Redis信息 1.1在pom.xml添加依赖 pom.xml文件&#xff1a; <…...

5.1 合并数据

5.1 合并数据 5.1.1 堆叠合并数据1、横向堆叠 concat()2、纵向堆叠 concat()和append() 5.1.2 主键合并数据 merge()和join()5.1.3 重叠合并数据 combine_first() 5.1.1 堆叠合并数据 堆叠就是简单地把两个表拼在一起&#xff0c;也被称作轴向连接、绑定或连接。依照连接轴的方…...

华为OD机试真题 JavaScript 实现【求解立方根】【牛客练习题】

一、题目描述 计算一个浮点数的立方根&#xff0c;不使用库函数。保留一位小数。 数据范围&#xff1a;∣val∣≤20 。 二、输入描述 待求解参数&#xff0c;为double类型&#xff08;一个实数&#xff09; 三、输出描述 输出参数的立方根。保留一位小数。 四、解题思路…...

初探BERTPre-trainSelf-supervise

初探Bert 因为一次偶然的原因&#xff0c;自己有再次对Bert有了一个更深层地了解&#xff0c;特别是对预训练这个概念&#xff0c;首先说明&#xff0c;自己是看了李宏毅老师的讲解&#xff0c;这里只是尝试进行简单的总结复述并加一些自己的看法。 说Bert之前不得不说现在的…...

Ficus 第二弹,突破限制器的 Markdown 编辑管理软件!

大家好&#xff0c;我们是 ggG 团队&#xff0c;我们开发的 markdown 笔记管理软件 Ficus Beta 版本正式发布了。详情可以见我们官网&#xff0c;也可以来我们仓库查看。 相对于 Alpha 版本&#xff08;可以在我们之前的博客中查看&#xff09;&#xff0c;主要有 3 点明显的提…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...