Go 如何使用指针灵活操作内存


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • 指针基础
      • 指针的赋值与解引用
      • 指针与数组
      • 指针与切片
      • 指针与结构体
      • 指针与函数
      • 指针与内存分配
      • 指针的安全性
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容

在 Go 语言中,指针是一种强大的工具,它允许开发者直接操作内存,从而提高程序的性能和灵活性。本文将深入探讨 Go 中指针的使用技巧,帮助开发者更高效地编写代码。

指针基础

在 Go 中,指针是指向变量内存地址的变量。每个变量都有一个内存地址,而指针变量存储的就是这个地址。声明指针的基本语法是:

var ptr *int

这里,ptr 是一个指向 int 类型的指针。

指针的赋值与解引用

指针可以被赋值为变量的地址,使用 & 操作符可以获取变量的地址:

var value int = 10
ptr = &value

此时,ptr 指向 value 的内存地址。要访问指针指向的值,可以使用解引用操作符 *

fmt.Println(*ptr) // 输出:10

指针与数组

在 Go 中,数组名本身就是一个指向数组第一个元素的指针。这意味着,当你将数组作为参数传递给函数时,实际上是在传递数组的指针。这不仅可以减少内存的复制,还可以在函数内部修改原数组的元素。

func modifyArray(arr *[5]int) {(*arr)[0] = 20
}func main() {myArray := [5]int{1, 2, 3, 4, 5}modifyArray(&myArray)fmt.Println(myArray) // 输出:[20 2 3 4 5]
}

指针与切片

切片在 Go 中是一种动态数组,它底层实际上是一个结构体,包含指向数组的指针、长度和容量。通过指针,我们可以操作切片的底层数组。

func appendToSlice(slice []int, value int) {slice = append(slice, value)
}func main() {mySlice := []int{1, 2, 3}appendToSlice(mySlice, 4)fmt.Println(mySlice) // 输出:[1 2 3 4]
}

指针与结构体

结构体是 Go 中实现面向对象编程特性的一种方式。通过指针,我们可以在函数中修改结构体的字段。

type MyStruct struct {Field int
}func modifyStruct(s *MyStruct) {s.Field = 100
}func main() {myStruct := MyStruct{Field: 10}modifyStruct(&myStruct)fmt.Println(myStruct.Field) // 输出:100
}

指针与函数

在 Go 中,函数可以返回指针类型的值。这使得我们可以在函数中创建新的变量,并将其地址返回给调用者。

func createInt() *int {var value int = 42return &value
}func main() {ptr := createInt()fmt.Println(*ptr) // 输出:42
}

指针与内存分配

Go 运行时提供了垃圾回收机制,但是有时候我们仍然需要手动管理内存。使用 new 关键字可以分配内存,并返回指向新分配内存的指针。

func main() {ptr := new(int)*ptr = 10fmt.Println(*ptr) // 输出:10
}

指针的安全性

虽然指针提供了极大的灵活性,但也带来了潜在的风险。例如,使用未初始化的指针或解引用空指针都会导致运行时错误。因此,在使用指针时,开发者需要格外小心。

总结

指针是 Go 语言中一个强大的特性,它允许开发者以低级的方式操作内存。通过掌握指针的使用技巧,开发者可以编写出更高效、更灵活的代码。然而,使用指针也需要谨慎,以避免潜在的错误和安全问题。

在本文中,我们探讨了 Go 中指针的多种使用技巧,包括与数组、切片、结构体和函数的交互,以及如何安全地使用指针。希望这些知识能够帮助你更好地理解和使用 Go 语言中的指针。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

Leetcode 3196. Maximize Total Cost of Alternating Subarrays

Leetcode 3196. Maximize Total Cost of Alternating Subarrays 1. 解题思路2. 代码实现 题目链接:3196. Maximize Total Cost of Alternating Subarrays 1. 解题思路 这一题就是一个动态规划,只需要考虑每一个元素作为开始和处于序列当中的二元态即可…

深度学习引言

深度学习引言 什么是神经网络? 我们常常用深度学习这个术语来指训练神经网络的过程。有时它指的是特别大规模的神经网络训练。 神经网络的监督学习 关于神经网络也有很多的种类,考虑到它们的使用效果,有些使用起来恰到好处,但事实…

90天瘦30斤瘦身计划

90天瘦30斤瘦身计划 重要提示: 在开始任何减肥计划之前,强烈建议咨询医生或营养师以确保该计划适合您的健康状况。减肥过快可能对身体健康产生负面影响,因此请确保您的方法既安全又可持续。 目标: 在90天内健康地减轻30斤体重。…

爬虫笔记14——爬取网页数据写入MongoDB数据库,以爱奇艺为例

下载MongoDB数据库 首先,需要下载MongoDB数据库,下载的话比较简单,直接去官网找到想要的版本下载即可,具体安装过程可以看这里。 pycharm下载pymongo库 pip install pymongo然后在在python程序中我们可以这样连接MongoDB数据库…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇Kerberos委派安全非约束系约束系RBCD资源系Spooler利用

#委派安全知识点 委派是一种域内应用模式,是指将域内用户账户的权限委派给服务账号,服务账号因此能以用户的身份在域内展开活动(请求新的服务等),类似于租房中介房东的关系去理解。 域委派分类: 1、非约束委派(Unconstrained Delegation, UD) 2、约束委派(Constrained D…

【Linux】使用 rz 和 sz 命令在 Linux 中进行文件传输

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 🎵 王心凌《那年夏天宁静的海》 在 Linux 系统中,rz 和 sz 是两个用…

深度神经网络:解锁智能的密钥

深度神经网络:解锁智能的密钥 在人工智能的浩瀚星空中,深度神经网络(Deep Neural Networks, DNNs)无疑是最耀眼的那颗星。它以其强大的学习能力、高度的适应性和广泛的应用场景,成为了我们解锁智能世界的一把密钥。本…

[个人感悟] MySQL应该考察哪些问题?

前言 MySQL作为SQL类型基础典型, 通常会问, 索引, 事务, SQL实战 这3个部分的问题. 问题 问题-架构 能聊聊MySQL的基本架构么? MySQL支持的存储引擎有哪些, 你主要使用过哪种? 说说你的理解? 问题-索引 什么是索引? MYSQL内所有的基本种类有哪些?不同分类…

IPD推行成功的核心要素(十三)IPD产品开发流程让企业正确地做事情

一个公司能否成功,取决于它适应市场需求和竞争环境变化的速度。公司需要不断创新,以符合客户期望并保持相关性。这意味着需要更快速地推出新产品和改进产品。简化的产品开发流程能够支持快速开发周期,帮助公司领先于市场,用优秀的…

浏览器进程与线程(4)

上一篇👉: 浏览器安全 文章目录 进程与线程1.进程与线程概念2.进程和线程的区别进程的特性线程的特性通信与同步 3.浏览器渲染进程中的线程4.什么是僵尸进程和孤儿进程5.死锁资源类型产生死锁的原因必要条件解决策略 6.进程通信方式7. 如何实现浏览器内多个标签页之…

植物大战僵尸杂交版2.1版本终于来啦!游戏完全免费

在这个喧嚣的城市里,我找到了一片神奇的绿色世界——植物大战僵尸杂交版。它不仅是一款游戏,更像是一扇打开自然奥秘的窗户,让我重新认识了植物和自然的力量。 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d6…

如何在Rust中实现条件编译

目前正在学习使用Rust作后端开发,学习过程经常需要写一些调试代码,使用过程发现没有像#if 0 . . . #endif这样的条件编译。于是查阅资料,找到了替代方案,别说还挺好用。 目录 前言配置Cargo.toml文件代码中添加条件编译执行结果对…

MySQL的综合运用

MySQL版的葵花宝典,欲练此功,挥刀自。。。呃,,,说错了,是先创建两个表,分别是location表和store_info表 示例表为location表和store_info表,如下图所示: 操作一&#xf…

Layui为select绑定change事件/Layui中select绑定change事件不生效

1、问题概述? 在使用jQuery的时候,我们可以通过如下方式为select下拉框绑定change事件,但是在layui中不生效。 所以经常有人发问:Layui中为select绑定change事件不生效。 $(function(){//通过id为select绑定change事件$("…

【C++高阶】掌握AVL树:构建与维护平衡二叉搜索树的艺术

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:STL-> map与set 🌹🌹期待您的关注 🌹🌹 ❀AVL树 📒1. AVL树…

mysql5.7升级到mysql8.0遇坑

mysql5.7升级到mysql8.0发现生产环境服务会报错 Error querying database. Cause: java.sql.SQLSyntaxErrorException: FUNCTION GeomFromText does not exist 在MySQL 8.0中,GeomFromText函数已经被弃用,取而代之的是ST_GeomFromText函数。你可以将你…

JavaSE (Java基础):运算符

3 运算符 3.1 二元运算符 为什么下面这段代码中最后的语句中b元素要加(double)呢? 因为要计算10/40的话,他们都是int类型的在计算机中会取整,而计算机取整一般都是直接舍去小数点后面的数字,那么就会返回0&…

服务端渲染(SSR)

服务端渲染(SSR) 服务端渲染(Server-Side Rendering, SSR)是一种网页开发技术,它允许前端应用程序的部分或全部内容在服务器端被生成为HTML,然后发送到客户端浏览器中展示。这样做的主要目标是提供更好的初…

VScode基本使用

VScode下载安装: Visual Studio Code - Code Editing. Redefined MinGW的下载安装: MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net x86是64位处理器架构,i686是32为处理器架构。 POSIX和Win32是两种不同的操…

vscode pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文…