理解Go中的指针

引言

当你用Go编写软件时,你将编写函数和方法。你可以将数据作为参数传递给这些函数。有时,函数需要数据的本地副本,而你希望原始数据保持不变。例如,如果你是一家银行,你有一个函数向用户显示根据他们选择的储蓄计划而产生的余额变化,你不希望在客户选择计划之前更改他们的实际余额;你只是想在计算中使用它。这被称为按值传递,因为你将变量的值发送给函数,而不是变量本身。

其他时候,你可能希望函数能够改变原始变量中的数据。例如,当银行客户向他们的账户存款时,您希望存款功能能够访问实际余额,而不是副本。在这种情况下,你不需要将实际数据发送给函数;你只需要告诉函数数据在内存中的位置。一种称为指针的数据类型保存的是数据的内存地址,而不是数据本身。内存地址告诉函数在哪里找到数据,而不是数据的值。你可以将指针而不是数据传递给函数,然后函数可以原地改变原始变量。这被称为引用传递,因为变量的值并没有传递给函数,只有它的位置。

在本文中,您将创建和使用指针来共享对变量内存空间的访问。

定义和使用指针

当你使用指向变量的指针时,有几个不同的语法元素需要你理解。第一个是和号(&)的使用。如果你在变量名前放一个&符号,你是在声明你想要获取地址,或者指向该变量的指针。第二个语法元素是使用星号(*)或解引用操作符。当你声明一个指针变量时,在变量名后面加上指针所指向的变量的类型,并以*作为前缀,像这样:

var myPointer *int32 = &someint

这将创建myPointer作为一个指向int32变量的指针,并将指针初始化为someint的地址。这个指针实际上并没有包含int32,只是一个int32的地址。

让我们看一下指向string的指针。下面的代码声明了一个字符串的值和一个指向字符串的指针:

main.go

package mainimport "fmt"func main() {var creature string = "shark"var pointer *string = &creaturefmt.Println("creature =", creature)fmt.Println("pointer =", pointer)
}

使用下面的命令运行这个程序:

go run main.go

运行这个程序时,它会打印出变量的值,以及变量的存储地址(指针地址)。内存地址是十六进制数,并不是人类可读的。在实践中,您可能永远不会输出内存地址来查看它。我们展示给你们是为了说明。因为每个程序在运行时都是在自己的内存空间中创建的,所以每次运行时指针的值都不一样,也和下面的输出不一样:

Outputcreature = shark
pointer = 0xc0000721e0

我们定义的第一个变量名为creature,并将它设置为一个值为sharkstring。然后我们创建了另一个名为pointer的变量。这次,我们将pointer变量的值设置为creature变量的地址。我们使用&符号(’ & ')将值的地址存储在变量中。这意味着pointer变量存储的是creature变量的地址,而不是实际值。

这就是为什么当我们打印pointer的值时,我们收到了0xc0000721e0的值,这是creature变量当前存储在计算机内存中的地址。

如果你想打印出pointer变量指向的变量的值,你需要解引用该变量。下面的代码使用*操作符解引pointer变量并获取它的值:

main.go


package mainimport "fmt"func main() {var creature string = "shark"var pointer *string = &creaturefmt.Println("creature =", creature)fmt.Println("pointer =", pointer)fmt.Println("*pointer =", *pointer)
}
Outputcreature = shark
pointer = 0xc000010200
*pointer = shark

我们现在添加的最后一行解引了pointer变量,并打印出存储在该地址的值。

如果你想修改存储在pointer变量位置的值,你也可以使用解引用操作符:

main.go

package mainimport "fmt"func main() {var creature string = "shark"var pointer *string = &creaturefmt.Println("creature =", creature)fmt.Println("pointer =", pointer)fmt.Println("*pointer =", *pointer)*pointer = "jellyfish"fmt.

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

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

相关文章

OpenAI在中国,申请GPT-6、GPT-7商标

根据最新商标信息显示,OpenAI已经在中国提交了GPT-6和GPT-7的商标注册信息,分类是科学仪器和网站服务两大类。申请日期是今年的11月2日,目前处于审核状态。 该申请由知识产权代理公司完成,但申请人的地址正是OpenAI在美国公司的地…

Echarts图表title使用富文本

rich中有配置的话(如a)使用该样式,没有配置样式的话(如b)使用外层textstyle的样式,textstyle没有样式的话使用默认样式 const option1 {tooltip: {trigger: "item",},title: {text: ["{a|1…

Java代码审计之SpEL表达式注入漏洞分析

文章目录 前言SpEL表达式基础基础用法安全风险案例演示 CVE-2022-22963漏洞简述环境搭建反弹shell CVE漏洞调试分析本地搭建调试分析补丁分析 总结 前言 表达式注入是 Java 安全中一类常见的能够注入命令并形成 RCE 的漏洞,而常见的表达式注入方式有 EL 表达式注入…

124.(leaflet篇)leaflet禁止地图移动,缩放,双击

地图之家总目录(订阅之前必须详细了解该博客) 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

深入探索HTTPS加密技术与新兴安全趋势:保卫隐私的未来之路

在前文中&#xff0c;我们了解了HTTPS加密协议的工作原理和应用场景。然而&#xff0c;随着技术的不断发展和网络安全威胁的不断演变&#xff0c;HTTPS加密技术也在不断进化。在本篇博文中&#xff0c;我们将更深入地探讨HTTPS加密技术&#xff0c;并介绍一些新兴的安全趋势&am…

css中的 box-sizing: border-box

box-sizing: border-box 是 CSS 中的一个盒子模型属性&#xff0c;用于指定元素的盒子模型的计算方式。默认的盒子模型是 content-box&#xff0c;而使用 border-box 则表示元素的宽度和高度包括了元素的边框和内边距&#xff0c;而不仅仅是内容的宽度和高度。 在默认的 conte…

【Docker】使用docker-compose搭建django+vue工程文章

我们尝试使用docker-compose编排一个后端基于django,前端基于vue,数据库为postgresql并使用nginx进行反向代理的web工程。 工程准备 Docker 安装Docker 安装docker-compose django 在python3.7的环境下创建 修改settings.py文件 修改 将静态文件收集路径添加进 ,笔…

pip指定优先从豆瓣源下载包

对于 Unix/macOS 系统&#xff0c;使用以下命令&#xff1a; pip config set global.index-url https://pypi.douban.com/simple/ 对于 Windows 系统&#xff0c;打开命令提示符或PowerShell&#xff0c;并使用相同的命令&#xff1a; pip config set global.index-url http…

react re-render的解决方案

问题代码 import {Dispatch, FC, SetStateAction, useState} from reactimport ./App.cssconst Child: FC<{ m: number, setM: Dispatch<SetStateAction<number>> }> (props) > {const {m, setM } propsreturn (<div><button onClick{() &…

阿里java社招一面

1、项目所负责的功能介绍&#xff1b;B用户对A用户的用餐评价进行评论以及B用户对评论进行追评的话怎么设计数据库结构&#xff1b;菜品好评度排行榜怎么实现的 2、clickhouse为什么快 3、线程池有哪几种&#xff0c;分别说说定义和优缺点&#xff1b;多线程使用过程中要注意…

XUbuntu22.04之8款免费UML工具(一百九十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

前端知识笔记(四)———JQuery 自动刷新页面但不闪烁的实现方法

在本文中&#xff0c;我们将介绍如何使用jQuery实现自动刷新页面但不出现闪烁的效果。通常情况下&#xff0c;当我们需要自动刷新页面时&#xff0c;使用简单的location.reload()方法即可实现&#xff0c;但这会导致页面在刷新时出现短暂的白屏或闪烁。为了解决这个问题&#x…

供应链管理痛点大解析!内附解决方案

供应链是指涉及产品或服务生产、运输、分销和最终交付给客户的过程。 用一个汽车制造的例子来帮助大家理解&#xff1a; 原材料采购&#xff1a; 汽车制造商需要从供应商处采购制造汽车所需的原材料&#xff0c;例如金属、橡胶、塑料和玻璃。生产制造&#xff1a;获得原材料&…

UnoCSS 原子化开发初体验

UnoCSS 是一个即时的原子化 CSS 引擎&#xff0c;旨在灵活和可扩展。核心是不拘一格的&#xff0c;所有的 CSS 工具类都是通过预设提供的。再也不用为了取一个 classname 类名而烦恼了。 一、UnoCSS 特点 完全可定制&#xff1a;无核心工具&#xff0c;所有功能都通过预设提供…

如何公网访问内网的群晖NAS随时随地远程访问本地存储的学习资源

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

成都工业学院Web技术基础(WEB)实验六:ECMAScript基础语法

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

TwinCAT3 Modbus-TCP Client/Server使用

目录 一、环境配置和准备 1、PLC中安装TF6250-Modbus-TCP库 2、勾选TF6250的license 3、PLC工程中添加Tc2_ModbusSrv库文件 4、分别创建测试ModbusTCP测试的Server和Client程序 二、PLC作为Client端 1、设置测试电脑IP地址 2、运行MobusTCP测试工具 3、PLC端程序编写 …

Hiera实战:使用Hiera实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

可学习超图拉普拉斯算子代码

python版本&#xff1a;3.6。sklearn版本&#xff1a;scikit-learn0.19 问题1&#xff1a;ERROR: Could not build wheels for ecos, scs, which is required to install pyproject.toml-based projects| 解决办法&#xff1a;cvxpy安装过程中遇到的坑_ecos 2.0.7.post1 cp37 …

大数据技术7:基于StarRocks统一OALP实时数仓

前言&#xff1a; 大家对StarRocks 的了解可能不及 ClickHouse或者是远不及 ClickHouse 。但是大家可能听说过 Doris &#xff0c;而 StarRocks 实际上原名叫做 Doris DB &#xff0c;他相当于是一个加强版的也就是一个 Doris ,也就是说 Doris 所有的功能 StarRocks 都是有的&a…