Go语言中指针操作符*与取地址符&的全面解析

Go语言中指针操作符*与取地址符&的全面解析

本文深入探讨Go语言中*和&这两个核心操作符的作用。&用于获取变量的内存地址,生成一个指向该变量的指针;而*则用于声明指针类型、对指针进行解引用以访问其指向的值,以及通过指针间接修改变量的值。理解它们对于掌握Go的内存管理和数据传递机制至关重要,尤其是在函数参数传递和结构体操作中。

在go语言中,指针是一个核心概念,它允许程序直接操作内存地址,从而实现更灵活的数据管理和高效的程序设计。理解*(星号)和&(取地址符)这两个操作符是掌握go语言指针的关键。

1. & 操作符:取地址(Address-of Operator)

& 操作符用于获取一个变量的内存地址。当应用于一个变量时,它会返回该变量在内存中的地址,这个地址就是一个指向该变量类型的新指针。

语法: &variable

示例:

package mainimport "fmt"func main() {    value := 100    ptr := &value // ptr 现在是一个指向 value 变量的指针    fmt.Printf("变量 value 的值:%dn", value)    fmt.Printf("变量 value 的内存地址:%pn", ptr) // %p 用于打印指针地址}

在上述示例中,ptr 变量存储的不是 100 这个值,而是 value 变量在内存中的具体位置。

立即学习“go语言免费学习笔记(深入)”;

2. * 操作符:指针的声明、解引用与间接赋值

* 操作符在Go语言中扮演了多重角色,其具体含义取决于它出现的位置。

2.1 指针类型声明(Pointer Type Declaration)

当 * 紧跟在一个类型前面时(例如 *int, *string),它表示声明一个指向该类型数据的指针。这意味着这个变量将存储一个内存地址,而这个地址指向的是指定类型的数据。

语法: var variableName *Type

示例:

package mainimport "fmt"func main() {    var p *int // 声明 p 是一个指向 int 类型数据的指针    fmt.Printf("p 的零值(未初始化):%vn", p) // 指针的零值是 nil}

2.2 指针解引用(Dereferencing)

当 * 放置在一个已声明的指针变量前面时,它被称为解引用操作符。解引用操作用于访问或获取指针所指向的内存地址中存储的实际值。

语法: *pointerVariable

示例:

package mainimport "fmt"func main() {    value := 200    ptr := &value // ptr 指向 value 的地址    fmt.Printf("通过 ptr 解引用获取 value 的值:%dn", *ptr) // *ptr 获取 ptr 指向的值}

2.3 指针间接赋值(Indirect Assignment)

通过解引用操作符,我们不仅可以读取指针指向的值,还可以修改该值。当 *pointerVariable 出现在赋值语句的左侧时,它表示修改指针所指向内存地址中的值。

语法: *pointerVariable = newValue

示例:

package mainimport "fmt"func main() {    num := 300    ptr := &num // ptr 指向 num 的地址    fmt.Printf("修改前 num 的值:%dn", num)    *ptr = 400 // 通过 ptr 间接修改 num 的值    fmt.Printf("修改后 num 的值:%dn", num)}

3. 综合示例分析

为了更深入地理解 & 和 * 的协同工作,我们来分析一个典型的代码片段:

package mainimport (    "fmt"    "os")func main() {    s := "hello" // 声明并初始化字符串变量 s    if s[1] != 'e' { // 检查字符串 s 的第二个字符是否为 'e'        os.Exit(1) // 如果不是,则退出程序    }    fmt.Printf("s 初始值: %s, 地址: %pn", s, &s)    s = "good bye" // 重新赋值 s    fmt.Printf("s 重新赋值后: %s, 地址: %pn", s, &s)    var p *string = &s // 声明一个字符串指针 p,并用 s 的地址初始化它    fmt.Printf("指针 p 的值 (s 的地址): %pn", p)    fmt.Printf("通过指针 p 解引用得到的值: %sn", *p)    *p = "ciao" // 通过指针 p 间接修改 s 的值    fmt.Printf("通过指针 p 修改后 s 的值: %sn", s)    fmt.Printf("通过指针 p 修改后,通过 p 解引用得到的值: %sn", *p)}

分析过程:

s := “hello”:变量 s 被创建并赋值为 “hello”。s = “good bye”:s 的值被更新为 “good bye”。此时 s 的内存地址保持不变,但其内容已更改。var p *string = &s:&s:获取变量 s 的内存地址。*string:声明 p 是一个指向 string 类型的指针。=:将 s 的内存地址赋值给 p。现在,p 指向 s 所在的内存位置。*p = “ciao”:*p:解引用 p,表示访问 p 所指向的内存位置(即 s 的内存位置)。=:将 “ciao” 这个字符串赋值到 p 所指向的内存位置。这意味着 s 的值被间接修改为 “ciao”。

运行此代码,您会观察到 s 的值最终变为 “ciao”,这证明了通过指针可以实现对原始变量的间接修改。

4. Go语言中的“引用”与“值传递”

Go语言中所有函数参数的传递都是值传递(pass by value)。这意味着当您将一个变量作为参数传递给函数时,函数会接收到该变量的一个副本。对副本的任何修改都不会影响原始变量。

然而,当您传递一个指针的值时,函数接收到的是原始变量的内存地址的副本。虽然这个地址本身是一个副本,但它指向的仍然是原始变量在内存中的位置。因此,通过这个指针副本解引用并修改其指向的值,就能够影响到原始变量。这在效果上类似于其他语言中的“引用传递”,但本质上仍是值传递——只是传递的是一个地址值。

package mainimport "fmt"func modifyValue(x int) { // 值传递,x 是 num 的副本    x = 20}func modifyValueByPointer(ptr *int) { // 值传递,ptr 是 &num 的副本    *ptr = 20 // 通过指针修改 num}func main() {    num := 10    fmt.Println("初始值:", num) // 10    modifyValue(num)    fmt.Println("值传递后:", num) // 10 (未改变)    modifyValueByPointer(&num)    fmt.Println("指针传递后:", num) // 20 (已改变)}

5. 指针的应用场景与注意事项

5.1 典型应用场景

修改函数外部变量:如上例所示,当需要在函数内部修改函数外部的变量时,传递变量的指针是标准做法。避免大数据结构复制:当结构体或数组非常大时,将其作为参数传递会导致整个数据结构的复制,消耗大量内存和时间。传递其指针可以避免这种开销,提高性能。实现链表、树等数据结构:这些数据结构天然依赖于节点间的指针连接。方法接收者:Go语言中,方法的接收者可以是值类型也可以是指针类型。使用指针接收者可以修改接收者实例的字段。

5.2 注意事项

零值指针(nil):未初始化的指针变量的零值是 nil。尝试解引用 nil 指针会导致运行时错误(panic)。在使用指针前,务必确保其已被正确初始化或检查是否为 nil。Go不支持指针算术:与C/C++不同,Go语言不允许对指针进行加减运算来访问相邻内存地址。这是为了提高内存安全性和代码可读性。垃圾回收:Go语言拥有自动垃圾回收机制,开发者无需手动管理内存的分配和释放。当一个内存地址不再有任何指针指向它时,垃圾回收器会在适当的时候自动回收这块内存。

总结

& 和 * 是Go语言中操作指针的两个基本且强大的操作符。& 用于获取变量的内存地址,生成一个指针;而 * 则用于声明指针类型、解引用指针以访问其指向的值,以及通过指针间接修改变量的值。理解并熟练运用它们,是编写高效、安全Go程序的基础。掌握指针不仅能让您更深入地理解Go的内存模型,也能帮助您在特定场景下优化程序性能和实现复杂的数据结构。

以上就是Go语言中指针操作符*与取地址符&的全面解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1394051.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Golang如何实现TCP长连接通信 演示net.Conn与心跳机制的结合
上一篇 2025年12月15日 12:02:48
如何用Golang构建高并发WebSocket服务 展示连接管理的设计模式
下一篇 2025年12月15日 12:03:07

相关推荐

  • Java编程:计算用户输入字符串的词汇属性百分比

    Java编程:计算用户输入字符串的词汇属性百分比Java编程:计算用户输入字符串的词汇属性百分比Java编程:计算用户输入字符串的词汇属性百分比Java编程:计算用户输入字符串的词汇属性百分比

    本教程详细介绍了如何在Java中接收用户输入字符串,并利用正则表达式计算符合特定词汇属性(如纯字母单词、首字母大写单词)的字符串百分比。文章涵盖了输入验证、数据存储、正则表达式匹配以及模块化计数方法,旨在提供一个清晰、高效的解决方案。 1. 教程概述与核心挑战 在许多应用场景中,我们需要从用户那里获…

    2026年9月28日 • 用户投稿
    000
  • 豆包无需安装秒启动 豆包AI智能助手即时响应

    豆包无需安装秒启动 豆包AI智能助手即时响应豆包无需安装秒启动 豆包AI智能助手即时响应豆包无需安装秒启动 豆包AI智能助手即时响应豆包无需安装秒启动 豆包AI智能助手即时响应

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 步骤: 打开全民K歌…

    2026年9月28日 • 用户投稿
    000
  • Java中输入字符串单词百分比及特定模式识别教程

    Java中输入字符串单词百分比及特定模式识别教程Java中输入字符串单词百分比及特定模式识别教程Java中输入字符串单词百分比及特定模式识别教程Java中输入字符串单词百分比及特定模式识别教程

    本教程详细介绍了如何在Java中高效处理用户输入的字符串集合,并计算其中符合特定模式(如纯字母单词或以大写字母开头的单词)的字符串百分比。文章着重讲解了输入收集、正则表达式的应用、模块化计数方法的实现以及最终结果的展示,旨在帮助读者掌握字符串分析与处理的关键技巧。 在java应用程序开发中,经常需要…

    2026年9月28日 • 用户投稿
    000
  • 怎么用豆包AI帮我优化递归算法 递归算法优化的AI解决方案

    怎么用豆包AI帮我优化递归算法 递归算法优化的AI解决方案怎么用豆包AI帮我优化递归算法 递归算法优化的AI解决方案怎么用豆包AI帮我优化递归算法 递归算法优化的AI解决方案怎么用豆包AI帮我优化递归算法 递归算法优化的AI解决方案

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 步骤: 打开全民K歌…

    2026年9月28日 • 用户投稿
    100
  • sublime如何高亮显示当前编辑行_Sublime当前编辑行高亮显示设置指南

    sublime如何高亮显示当前编辑行_Sublime当前编辑行高亮显示设置指南sublime如何高亮显示当前编辑行_Sublime当前编辑行高亮显示设置指南sublime如何高亮显示当前编辑行_Sublime当前编辑行高亮显示设置指南sublime如何高亮显示当前编辑行_Sublime当前编辑行高亮显示设置指南

    启用Sublime Text当前行高亮需在用户配置中添加”highlight_line”: true,并可通过修改主题文件自定义颜色,注意语法正确与作用域匹配。 Sublime Text 高亮显示当前编辑行,能让你更专注于正在编写的代码,减少视觉疲劳,提高效率。简单来说,通过…

    2026年9月28日 • 用户投稿
    200
  • Java Mail发送会议邀请时处理时区问题的教程

    Java Mail发送会议邀请时处理时区问题的教程Java Mail发送会议邀请时处理时区问题的教程Java Mail发送会议邀请时处理时区问题的教程Java Mail发送会议邀请时处理时区问题的教程

    本文档旨在帮助开发者在使用Java Mail发送会议邀请时正确处理时区问题,避免会议时间在不同时区显示错误。我们将通过示例代码演示如何设置会议邀请的开始和结束时间,并指定正确的时区,确保会议时间在接收者的日历中准确显示。 在使用Java Mail发送会议邀请时,时区问题是一个常见的困扰。如果未正确处…

    2026年9月28日 • 用户投稿
    100
  • 谷歌发布实验性 AI 工具 Mixboard,支持使用自然语言生成创意板

    谷歌发布实验性 AI 工具 Mixboard,支持使用自然语言生成创意板谷歌发布实验性 AI 工具 Mixboard,支持使用自然语言生成创意板谷歌发布实验性 AI 工具 Mixboard,支持使用自然语言生成创意板谷歌发布实验性 AI 工具 Mixboard,支持使用自然语言生成创意板

    谷歌近日发布了一款实验性 ai 创意工具——mixboard,这是一款依托生成式 ai 技术打造的概念设计板,主打“开放式画布”理念,致力于帮助用户高效地将创意可视化。 https://www.php.cn/link/4fa0d97504185879b6e7524dda47d98b 据官方介绍,Mi…

    2026年9月28日 • 用户投稿
    000
  • Java Mail iCal会议邀请时区偏移问题详解与解决方案

    Java Mail iCal会议邀请时区偏移问题详解与解决方案Java Mail iCal会议邀请时区偏移问题详解与解决方案Java Mail iCal会议邀请时区偏移问题详解与解决方案Java Mail iCal会议邀请时区偏移问题详解与解决方案

    本文旨在解决Java Mail发送iCal会议邀请时因时区处理不当导致的会议时间偏移问题。核心问题在于iCal DTSTART和DTEND属性末尾的’Z’字符,它将时间指定为UTC,从而忽略了本地时区设置。教程将详细介绍iCal时间格式规范,并提供基于Java java.ti…

    2026年9月28日 • 用户投稿
    100
  • 豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​

    豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 步骤: 打开全民K歌…

    2026年9月28日 • 用户投稿
    200
  • 解决Java Mail发送iCalendar邀请时的时间区域问题

    解决Java Mail发送iCalendar邀请时的时间区域问题解决Java Mail发送iCalendar邀请时的时间区域问题解决Java Mail发送iCalendar邀请时的时间区域问题解决Java Mail发送iCalendar邀请时的时间区域问题

    本文将围绕在使用Java Mail发送iCalendar会议邀请时,会议时间出现偏差的问题展开,重点讨论如何正确处理时区信息。正如摘要所述,问题的根源在于iCalendar规范对时间格式的严格要求,以及开发者对时区处理的疏忽。下面我们将深入分析原因,并提供详细的解决方案。 理解iCalendar中的…

    2026年9月28日 • 用户投稿
    200
  • Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南

    Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南

    本教程深入探讨了Java Mail发送iCal会议邀请时常见的时区偏移问题。核心在于iCal DTSTART和DTEND字段对UTC时间(以’Z’结尾)的默认解释。文章将详细阐述如何利用java.time API正确构造本地时间或带有时区标识的时间字符串,从而确保会议邀请在接…

    2026年9月28日 • 用户投稿
    200
  • 荣耀手机摄像头如何调整以提升拍摄质量?教你设置高画质的步骤

    答案:荣耀手机拍出高画质照片需善用专业模式与AI功能。清洁镜头后,根据场景选择模式,如夜景、人像或专业模式;在专业模式中调整ISO、快门速度、EV、白平衡和对焦;开启HDR和构图辅助线提升细节与构图;利用AI摄影优化色彩,结合高分辨率与三脚架保持稳定,不同光线下灵活设置参数,实现清晰出彩的拍摄效果。…

    2026年9月28日
    100
  • 用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024

    用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024

    vidda三色激光投影于2024年3月14日在上海awe中国家电及消费电子博览会再次展示其技术。除了传统的电影观赏体验,vidda三色激光投影还展示了一种新的玩法——通过两台投影仪拼接成超宽屏幕,为高刷新率游戏带来全新的沉浸体验。这种创新的应用方式吸引了众多参观者的目光,展示了投影技术在娱乐领域的无…

    2026年9月28日 • 用户投稿
    100
  • JNA高级教程:如何高效映射C语言嵌套结构体与联合体

    JNA高级教程:如何高效映射C语言嵌套结构体与联合体JNA高级教程:如何高效映射C语言嵌套结构体与联合体JNA高级教程:如何高效映射C语言嵌套结构体与联合体JNA高级教程:如何高效映射C语言嵌套结构体与联合体

    本教程深入探讨了JNA在Java与C语言之间进行复杂数据类型映射的机制,特别是针对包含嵌套结构体和联合体(Union)的场景。文章通过分析一个实际的错误案例,详细阐述了JNA对Java类继承Structure或Union的严格要求,并提供了两种核心解决方案:一是直接构建与C语言定义精确对应的JNA映…

    2026年9月28日 • 用户投稿
    100
  • 如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统

    如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统

    首先拉取Ubuntu镜像并启动容器,使用docker pull ubuntu:20.04和docker run -it命令进入系统,安装软件需执行apt update并配置常用工具,通过-v参数实现文件挂载共享,建议用Dockerfile或提交容器保存配置以防丢失。 在Docker中安装Linux环…

    2026年9月28日 • 用户投稿
    100
  • JNA高级教程:深入理解原生结构体与联合体映射

    JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射

    本教程详细探讨了JNA在与原生库交互时,如何正确映射包含嵌套结构体或联合体的复杂数据类型。文章首先分析了IllegalArgumentException的常见原因——非Structure类型字段导致JNA无法确定原生大小,随后提供了两种解决方案:一是直接通过JNA的Structure和Union类精…

    2026年9月28日 • 用户投稿
    100
  • 夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程

    夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程

    彻底卸载夸克APP需先通过系统设置卸载主程序,再手动删除残留文件夹如/Android/data/com.quark.browser,清除账户同步数据,并使用清理工具深度扫描残留项。 如果您尝试从设备中移除夸克应用,但发现残留数据或配置文件仍然存在,则可能是由于卸载过程中未清除用户数据与缓存信息。以下…

    2026年9月28日 • 用户投稿
    100
  • Java中List of Lists按指定列排序与查找教程

    Java中List of Lists按指定列排序与查找教程Java中List of Lists按指定列排序与查找教程Java中List of Lists按指定列排序与查找教程Java中List of Lists按指定列排序与查找教程

    本教程详细介绍了如何在Java中处理List<List>数据结构,以实现按指定“列”进行排序,并在此基础上高效查找包含特定值的“行”。文章通过自定义Comparator来对行数据进行比较和排序,并提供了识别目标列索引的策略,从而解决了在复杂嵌套列表中进行数据组织和检索的常见挑战。 1. …

    2026年9月28日 • 用户投稿
    200
  • 豆包AI安装后如何配置TPU加速 豆包AI张量处理器优化方案

    本文将详细介绍在豆包AI环境中,如何配置张量处理器(TPU)以实现加速优化。我们将从理解TPU的基本原理开始,逐步讲解安装驱动、设置环境以及验证加速效果的整个过程,旨在帮助用户高效地利用TPU提升豆包AI模型的训练和推理性能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 D…

    2026年9月28日
    300
  • sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法

    sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法

    安装插件并配置可实现Sublime Text保存时自动格式化代码,提升代码可读性与一致性。首先安装Package Control包管理器,通过控制台执行指定代码完成安装;重启后使用命令面板(Ctrl+Shift+P)调出Package Control: Install Package,搜索并安装所需…

    2026年9月28日 • 用户投稿
    900

发表回复

登录后才能评论
关注微信