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

Golang的引用类型和指针

在Golang中,引用类型指针是两个容易混淆的概念,但它们有本质的区别。理解它们的区别对于编写高效、正确的Go代码至关重要。


1. 引用类型

引用类型是Go语言中某些内置类型的统称,它们的值在传递时共享底层数据,而不是复制数据。Go中的引用类型包括:

  • Slice(切片)
  • Map(映射)
  • Channel(通道)
  • Function(函数)
  • Interface(接口)
特点
  • 共享底层数据:传递引用类型时,传递的是对底层数据的引用,而不是数据的副本。
  • 无需显式解引用:直接操作引用类型即可修改底层数据。
  • 零值为nil:引用类型的零值是nil,表示未初始化。
示例
func modifySlice(s []int) {s[0] = 100 // 修改底层数据
}func main() {s := []int{1, 2, 3}modifySlice(s)fmt.Println(s) // 输出: [100, 2, 3]
}
  • s是切片(引用类型),传递给modifySlice时共享底层数组,修改会反映到原切片。

2. 指针

指针是一个变量,存储的是另一个变量的内存地址。通过指针可以间接访问或修改目标变量的值。

特点
  • 显式解引用:需要通过*操作符访问目标变量的值。
  • 零值为nil:未初始化的指针值为nil
  • 传递地址:指针传递的是变量的地址,而不是值本身。
示例
func modifyInt(p *int) {*p = 100 // 解引用并修改目标变量的值
}func main() {x := 10modifyInt(&x) // 传递x的地址fmt.Println(x) // 输出: 100
}
  • p是指针,存储的是x的地址,通过*p修改x的值。

3. 引用类型 vs 指针

特性引用类型指针
本质内置类型(如切片、映射)存储变量地址的变量
传递方式共享底层数据传递变量的地址
解引用无需显式解引用需要显式解引用(*操作符)
零值nilnil
适用场景需要共享底层数据的场景(如切片、映射)需要直接修改变量值的场景

4. 常见误区

误区1:切片是指针
  • 错误理解:切片是引用类型,但它本身是一个结构体(包含指向底层数组的指针、长度和容量),而不是指针。
  • 正确理解:切片传递时共享底层数组,但切片本身是按值传递的(复制了结构体)。
误区2:引用类型不需要指针
  • 错误理解:引用类型已经共享底层数据,因此不需要指针。
  • 正确理解:引用类型在传递时共享数据,但如果需要修改引用类型本身(如重新分配切片),则需要使用指针。
示例
func reassignSlice(s *[]int) {*s = []int{4, 5, 6} // 修改切片本身
}func main() {s := []int{1, 2, 3}reassignSlice(&s) // 传递切片的指针fmt.Println(s) // 输出: [4, 5, 6]
}
  • 这里需要传递切片的指针,因为需要修改切片本身(重新分配)。

5. 总结

  • 引用类型:共享底层数据,适合传递大数据结构(如切片、映射)。
  • 指针:传递变量地址,适合需要直接修改变量值的场景。
  • 选择依据
    • 如果需要共享数据,优先使用引用类型。
    • 如果需要修改变量本身(如重新分配),使用指针。

理解这两者的区别有助于编写更高效、更清晰的Go代码。

相关文章:

Golang的引用类型和指针

在Golang中,引用类型和指针是两个容易混淆的概念,但它们有本质的区别。理解它们的区别对于编写高效、正确的Go代码至关重要。 1. 引用类型 引用类型是Go语言中某些内置类型的统称,它们的值在传递时共享底层数据,而不是复制数据。…...

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上,其内部结构如图4-1所示。作为单一芯片的计算机,它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU,由运算器和控制器两个部分构成;…...

32. C 语言 安全函数( _s 尾缀)

本章目录 前言什么是安全函数?安全函数的特点主要的安全函数1. 字符串操作安全函数2. 格式化输出安全函数3. 内存操作安全函数4. 其他常用安全函数 安全函数实例示例 1:strcpy_s 和 strcat_s示例 2:memcpy_s示例 3:strtok_s 总结 …...

Android T(13) 源码分析 — BufferQueue 的分析

Android T(13) 源码分析 — BufferQueue 的分析 文章目录 Android T(13) 源码分析 — BufferQueue 的分析前言摘要一、Java 层的 BufferQueue 分析二、原生层的 BufferQueue 分析1、BLASTBufferQueue 的创建2、BLASTBufferQueue 的更新3、Surface 的创建 总结 前言 该系列文章…...

Vite+TS项目中配置路径别名

在使用 Vite 和 TypeScript 的项目中配置路径别名,可以简化模块导入路径,提高代码的可读性和维护性。以下是详细的步骤和示例代码: 1. 配置 Vite 别名 前置条件 下载types/node 下面引入的path会用到 npm install types/node --save-dev原…...

看盘细节系列 篇二:集合竞价的9点18分大单打到3%以下或以上,9点19分撤单

文章目录 系列文章现象原因分析时间点含义正常情况测试市场反应诱导跟风操纵股价意图系列文章 看盘细节系列 篇一:集合竞价尾盘突变 现象 集合竞价中 9 点 18 分通过一笔大单或连续几笔大单将股价打到 3% 以下或以上,9 点 19 分又迅速撤单。从而在分时图上留下一根长长的上…...

Java继承简介

继承的本质:是代码的复用,重复使用已经定义好的方法和域(即全局变量) 要掌握继承首先要了解Java方法的重载和重写 方法的重载和重写 方法的重载 当前方法名相同,但是参数类型不同,发生重载 类比数学函…...

redis之哨兵集群搭建

一:哨兵集群工作概览图 1.监控:sentinel通过心跳监控redis的master和slave实例是否正常工作 2.故障转移:假如master出现故障,sentinel会选举一个slave作为新的master,当故障实例恢复后身份会变成slave,会以…...

保姆级AI开发环境搭建

目录 windows下环境搭建1. Python环境搭建2. 下载vLLM2.1 安装CUDA2.2 安装Pytorch2.3 安装vllm 3. 部署Deepseek(huggingface)3.1 DeepSeek的优化建议 4. ollama快速部署Deepseek4.1 下载Ollama4.2 配置Ollma4.2 运行模型4.3 其他Ollama命令 linux下环境…...

Arduino 型号的对比

常见 Arduino 型号的对比表格 涵盖了不同型号的关键参数和特点,方便你根据项目需求进行选择: 型号Arduino UnoArduino Mega 2560Arduino LeonardoArduino NanoArduino Due微控制器ATmega328PATmega2560ATmega32U4ATmega328P 或 ATmega168SAM3X8E&#…...

Kafka系列之:定位topic只能保存最新数据的原因

Kafka系列之:定位topic只能保存最新数据的原因 一、背景二、定位排查方向三、深入排查一、背景 kafka topic保存的数据少,topic只能保存最新的数据二、定位排查方向 能想到的定位排查方向:topic能存储的数据量、topic数据保存的时间、topic数据大小./bin/kafka-configs.sh -…...

AtCoder Beginner Contest 391(A~E题题解)

A - Lucky Direction 思路&#xff1a;纯模拟的一个水题 #include <bits/stdc.h> using namespace std; #define int long long string s; signed main() { cin>>s;for(int i0;i<s.size();i){char cs[i];if(cN){cout<<"S";}else if(c…...

mysql mvcc 锁 关系

多版本并发控制&#xff08;MVCC&#xff09;是一种用于数据库并发控制的机制&#xff0c;它可以在保证数据一致性的同时&#xff0c;提高数据库的并发性能。下面结合 MVCC 机制&#xff0c;详细阐述常见的四种事务隔离级别&#xff08;读未提交、读已提交、可重复读、串行化&a…...

安卓手机基于 Termux 安装 AList 并设置开机自启的详细教程

安装 AList 安装 Termux&#xff1a; 点击下载 更新软件包&#xff1a;打开 Termux&#xff0c;运行以下命令以更新软件包列表并升级已安装的软件包&#xff1a; bash复制 pkg update && pkg upgrade安装 AList&#xff1a;运行以下命令安装 AList&#xff1a; bash复…...

LeetCode:503.下一个更大元素II

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;503.下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[…...

实验5 配置OSPFv2验证

实验5 配置OSPFv2验证 1.实验目的 &#xff08;1&#xff09;OSPFv2 验证的类型和意义。 &#xff08;2&#xff09;配置基于区域的 OSPFv2 简单口令验证和 MD5 验证的方法。 &#xff08;3&#xff09;配置基于链路的 OSPFv2 简单口令验证和 MD5 验证的方法。 2.实验准备 配置…...

第二节 docker基础之---镜像构建及挂载

查看当前镜像&#xff1a; [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [rootdocker ~]#很明显docker是咱们新搭建的所以目前还没有镜像 1&#xff0c;搜索镜像&#xff1a; [rootdocker ~]# docker search centos 搜索镜像并过滤是官…...

论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding

MGMAE:Motion Guided Masking for Video Masked Autoencoding Abstract 掩蔽自编码&#xff08;Masked Autoencoding&#xff09;在自监督视频表示学习中展现了出色的表现。时间冗余导致了VideoMAE中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略&#xff0…...

记录一下 在Mac下用pyinstallter 打包 Django项目

安装: pip install pyinstaller 在urls.py from SheepMasterOneToOne import settings from django.conf.urls.static import staticurlpatterns [path("admin/", admin.site.urls),path(generate_report/export/, ReportAdmin(models.Report, admin.site).generat…...

【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)

偏差和方差的权衡&#xff08;Bias-Variance Tradeoff&#xff09; 1. 引言 在机器学习模型的训练过程中&#xff0c;我们常常面临一个重要的挑战&#xff1a;如何平衡 偏差&#xff08;Bias&#xff09; 和 方差&#xff08;Variance&#xff09;&#xff0c;以提升模型的泛…...

AI应用开发平台RiserFlow实战:从架构解析到智能客服构建

1. 项目概述&#xff1a;从“RiserFlow”看现代AI应用开发范式的演进最近在GitHub上看到一个挺有意思的项目&#xff0c;叫riserlabs/riserflow。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你点进去&#xff0c;会发现它其实指向一个更具体的产品&#xff…...

量子噪声对机器学习模型的影响与缓解策略

1. 量子噪声与机器学习模型的复杂关系量子计算领域近年来最令人兴奋的进展之一&#xff0c;就是量子机器学习&#xff08;QML&#xff09;的兴起。作为一名长期跟踪量子计算发展的从业者&#xff0c;我亲眼见证了量子算法在机器学习任务中展现出的惊人潜力。然而&#xff0c;在…...

基于EVE ESI API与AI Agent的自动化游戏监控与数据分析实践

1. 项目概述&#xff1a;为AI助手注入EVE宇宙的灵魂 如果你是一名《EVE Online》的玩家&#xff0c;同时又对AI自动化工具感兴趣&#xff0c;那么你很可能和我一样&#xff0c;长期被一个矛盾所困扰&#xff1a;一方面&#xff0c;EVE这个沙盒宇宙充满了需要监控和管理的日常事…...

用o1-preview构建端到端水质分类系统

1. 项目概述&#xff1a;用 o1-preview 构建端到端水质分类系统的真实复现手记 我做机器学习项目快十年了&#xff0c;从最早手动调参、写 Makefile 编译模型&#xff0c;到后来用 MLflow 跟踪实验、用 Flask 封装 API&#xff0c;再到如今用 Docker 打包上云——整个流程早已刻…...

手把手教你配置Synopsys DesignWare PCIe控制器:从寄存器读写到ATU映射实战

Synopsys DesignWare PCIe控制器深度配置指南&#xff1a;从寄存器操作到DMA通信实战 1. PCIe控制器基础架构解析 Synopsys DesignWare PCIe控制器作为业界广泛采用的IP核&#xff0c;其架构设计充分考虑了灵活性和可扩展性。控制器核心由以下几个关键模块组成&#xff1a; Tra…...

时间序列自监督学习实战:VIbCReg框架迁移与性能优化

1. 项目概述&#xff1a;当计算机视觉的自监督学习遇上时间序列在机器学习领域&#xff0c;获取高质量、大规模的标注数据一直是个老大难问题&#xff0c;尤其是在时间序列分析这个方向。无论是工业设备的振动监测、医疗心电信号分析&#xff0c;还是金融市场的波动预测&#x…...

3款实用论文降重神器,帮你轻松解决重复率难题

对于正在撰写毕业论文或者期刊论文的创作者来说&#xff0c;重复率不达标绝对是最头疼的问题之一。自己手动改了三五遍&#xff0c;重复率还是卡在要求线以上&#xff0c;不仅耽误时间还影响心态&#xff0c;这时候一款好用的降重工具就能帮你省下不少精力。今天我们就以第三方…...

基于MCP协议构建AI知识库:Alexandria项目部署与核心工作流解析

1. 项目概述&#xff1a;让AI拥有自己的“亚历山大图书馆”如果你和我一样&#xff0c;长期与各种AI助手&#xff08;比如Claude、Cursor、Codex&#xff09;打交道&#xff0c;肯定会遇到一个头疼的问题&#xff1a;知识无法沉淀。今天你花半小时教会AI助手某个项目的架构细节…...

Proteus仿真入门:手把手教你用51单片机点亮共阳数码管(附完整代码与电路图)

Proteus仿真入门&#xff1a;51单片机驱动共阳数码管全流程解析 第一次接触单片机仿真时&#xff0c;看着那些闪烁的数码管总觉得神奇又遥远。记得我大三那年&#xff0c;为了完成课程设计&#xff0c;在实验室熬了三个通宵才让数码管显示出正确的数字。今天&#xff0c;我们就…...

实战案例:使用tsne-cuda加速CIFAR-10数据集的高维可视化分析

实战案例&#xff1a;使用tsne-cuda加速CIFAR-10数据集的高维可视化分析 【免费下载链接】tsne-cuda GPU Accelerated t-SNE for CUDA with Python bindings 项目地址: https://gitcode.com/gh_mirrors/ts/tsne-cuda t-SNE是机器学习领域常用的高维数据降维可视化工具&a…...