【Go语言基础【12】】指针:声明、取地址、解引用
文章目录
- 零、概述:指针 vs. 引用(类比其他语言)
- 一、指针基础概念
- 二、指针声明与初始化
- 三、指针操作符
- 1. `&`:取地址(拿到内存地址)
- 2. `*`:解引用(拿到值)
- 四、空指针(nil)
- 五、指针作为函数参数
- 六、多维指针(指针的指针)
- 七、指针与切片/Map的关系
- 1. 切片(slice)
- 2. Map(make初始化)
- 八、注意事项
- 1. 禁止指针运算
- 2. 避免空指针解引用
- 3. 指针与值类型的选择
零、概述:指针 vs. 引用(类比其他语言)
特性 | 指针(Go) | 引用(C++) |
---|---|---|
本质 | 存储地址的变量 | 变量的别名(无独立地址) |
空值 | 支持nil | 必须指向有效变量 |
操作符 | & 取地址,* 解引用 | & 声明引用,直接操作 |
可变性 | 可重新指向其他变量 | 初始化后不可更改指向 |
一、指针基础概念
Go语言中的指针(Pointer)用于存储变量的内存地址,是实现高效数据操作的重要工具。与C语言相比,Go指针具有以下特点:
- 安全性:不支持指针运算(如指针加减整数),避免非法内存访问。
- 简化性:通过
&
取地址、*
解引用,语法简洁。 - 空指针:默认值为
nil
,避免野指针问题。
指针与变量的关系
- 变量:存储数据值,占据内存空间,可通过
&
获取地址。a := 10 // 变量a存储值10 addr := &a // addr存储a的地址(如0xc00001a0b8)
- 指针:专门存储地址的变量,类型为
*T
(T
为目标数据类型)。var ptr *int // 声明指向int的指针 ptr = &a // 指针ptr指向变量a的地址
二、指针声明与初始化
1. 声明指针变量
var ptr *int // 指向int的指针
var strPtr *string // 指向string的指针
var arrPtr *[5]int // 指向数组的指针2. 初始化为空指针var nilPtr *int // 初始值为nil(空指针)
fmt.Println(nilPtr == nil) // true3. 使用`new`函数初始化
`new(T)` 用于分配类型为`T`的零值内存,返回`*T`类型指针。 ptr := new(int) // 分配int类型内存,值为0
*ptr = 20 // 通过解引用赋值
fmt.Println(*ptr) // 输出:204. 直接赋值初始化a := 10
ptr := &a // 指针直接指向已有变量的地址
三、指针操作符
1. &
:取地址(拿到内存地址)
获取变量的内存地址,返回对应类型的指针。
a := "hello"
addr := &a // addr类型为*string,存储a的地址
*addr += "1212"
fmt.Println(*addr)hello1212
2. *
:解引用(拿到值)
通过指针获取目标变量的值,或修改目标变量的值。
ptr := new(int) // ptr类型为*int,指向值为0的int
*ptr = 100 // 通过解引用修改值
fmt.Println(*ptr) // 输出:100
四、空指针(nil)
- 定义:未指向任何有效内存的指针,默认值为
nil
。 - 作用:避免野指针,明确表示指针未初始化。
- 判断:
var ptr *int if ptr == nil {fmt.Println("指针未初始化") // 会执行 }
五、指针作为函数参数
通过指针传递参数,可在函数内部修改原始变量的值(避免值传递的拷贝开销)。
func modify(ptr *int) {*ptr = 200 // 通过解引用修改指针指向的值
}func main() {a := 100modify(&a) // 传递a的地址fmt.Println(a) // 输出:200(原始变量已修改)
}
六、多维指针(指针的指针)
指针的指针用于存储指针变量的地址,语法为**T
(二维指针)、***T
(三维指针)等。
func main() {a := 10 // 变量aptr1 := &a // 一维指针:*int,指向aptr2 := &ptr1 // 二维指针:**int,指向ptr1ptr3 := &ptr2 // 三维指针:***int,指向ptr2// 通过多维指针修改原始值**ptr2 = 20 // 等价于*ptr1 = 20,即a = 20***ptr3 = 30 // 等价于**ptr2 = 30,即*ptr1 = 30,a = 30fmt.Println(a) // 输出:30
}
七、指针与切片/Map的关系
1. 切片(slice)
切片本身是引用类型,其底层结构体包含指针,指向底层数组。
s := []int{1, 2, 3}
ptr := &s // ptr类型为*[]int,指向切片本身(非底层数组)
fmt.Println(ptr)//&[1 2 3]
2. Map(make初始化)
Map也是引用类型,声明后需通过make
初始化,指针操作与切片类似。
m := make(map[string]int)
ptr := &m // ptr类型为*map[string]int
八、注意事项
1. 禁止指针运算
Go不支持指针加减整数、指针比较大小等操作(避免内存越界)。
ptr := new(int)
ptr++ // 编译错误:invalid operation: ptr++ (non-numeric type *int)
2. 避免空指针解引用
对nil
指针执行解引用会导致运行时恐慌(panic)。
var ptr *int // nil指针
fmt.Println(*ptr) // panic: runtime error: invalid memory address or nil pointer dereference
3. 指针与值类型的选择
- 值类型(如
int
、struct
):默认值传递,修改需用指针。 - 引用类型(如切片、map、通道):本身包含指针,传递时无需额外取地址。
相关文章:
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...