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 = 42
    return &value
}

func main() {
    ptr := createInt()
    fmt.Println(*ptr) // 输出:42
}

指针与内存分配

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

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

指针的安全性

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

总结

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

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


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为的开发语言有2中,分别是ArkTS和仓颉,他们的区别是什么?

华为的开发语言有2中,分别是ArkTS和仓颉,他们的区别在哪呢? ArkTS和仓颉(cangjie)他们的区别是什么? 华为的仓颉和 ArkTS 是两种不同的编程语言,它们有以下区别: 设计目的&#xff1…

emoji控必备:制作一个emoji面板插件

说在前面 💻在数字时代,emoji表情符号已成为很多人沟通的重要工具,但是输入法中的emoji表情包可能不太够用,所以很多时候我会到在线的网站去复制emoji,然后再回来粘贴,这样操作感觉有点繁琐,所以…

在线朋友圈系统(Java Web)

本项目是一个基于Java Web技术栈开发的在线朋友圈系统,提供用户注册、登录、动态发布与评论、好友发现与管理等功能。通过Spring Boot、MySQL、MyBatis、Sa-token以及LayUI等技术实现,确保系统具有良好的性能和扩展性。 技术栈 后端技术 Spring Boot: …

问题-python-爬虫无法爬取外网资源问题(python爬虫)

方法一: 这个报错通过关掉梯子就能解决,目前不清楚具体原理。 后续了解具体原理了,我会在这篇文章上更新具体分析—— 方法二: 也可以把这个东西打开,但是用完建议关掉。

红酒品鉴新手速成:一键解锁味觉密码,让你秒变品鉴达人

红酒,这被誉为“液体宝石”的美酒,承载着丰富的口感和深邃的文化。对于许多人来说,品鉴红酒既是一种享受,也是一门艺术。然而,对于初学者来说,如何开始这场美妙的味觉之旅呢?今天,就…

vite项目自定义端口号

server.port​ 类型: number默认值: 5173 指定开发服务器端口。 注意:如果端口已经被使用,Vite 会自动尝试下一个可用的端口(5174),所以这可能不是开发服务器最终监听的实际端口。 在vite.con…

【金】02Y90-60 大数据-HivetoMysQL

1、安装 Java 程序(jdk) 2、添加以下JAR包 3、确认配置成自己的数据库 ....

jenkins api部署时,一直提示pending-Finished waiting

问题: 调用jenkins api部署时,一直提示pending-Finished waiting 解决方案: 这个问题困扰了很久,一直没有思路,后面看到调用jenkinsAPI本身会出现一段提示,pending in the quiet period,通过搜…

NAS安全存储怎样实现更精细的数据权限管控?

NAS存储,即网络附属存储(Network Attached Storage),是一种专用数据存储服务器,其核心特点在于将数据存储设备与网络相连,实现集中管理数据的功能。 NAS存储具有以下明显优势,而被全球范围内的企…

PostgreSQL 17 Beta 1 发布!

PostgreSQL 全球开发小组宣布,PostgreSQL 17 的第一个测试版本现已可供下载。此版本包含 PostgreSQL 17 正式发布时将提供的所有功能的预览,但测试期间版本的某些细节可能会发生变化。 #PG培训#PG考试#postgresql培训#postgresql考试#postgresql认证 您…

标准立项 | 湖库沉积物微生物多样性监测规程

饮用水水源地保护是饮用水安全保障中最重要的一个环节,其水质状况直接关系到供水区人民群众的身体健康。我国水资源存在水质差、资源短缺、资源时间空间分布不合理等问题。而近些年由水源地污染引发的饮用水安全事件,给居民的生产生活造成一定程度的影响…

Linux环境下安装MySQL5.7.33(RPM方式安装)

📣📣📣 哈喽!大家好,本专栏主要发表mysql实战的文章,文章主要包括: 各版本数据库的安装、备份和恢复,性能优化等内容的学习。。 📣 ***如果需要观看配套视频的小伙伴们,请…

智慧校园-实习管理系统总体概述

智慧校园实习管理系统是专为高校、企业和学生设计的一体化数字解决方案,它革新了传统实习管理的方式,通过科技手段促进了实习资源的高效对接与管理。该系统整合了实习信息发布、申请管理、过程监督、评估反馈等多个核心环节,构建了一个无缝连…

关于docker存储overlay2相关问题

报错如下: 报错原因:使用rm -rf 清理overlay2导致的,非正常清理。 正常清理命令如下: # 清理Docker的所有构建缓存 docker builder prune# 删除旧于24小时的所有构建缓存 docker builder prune --filter "until24h"#删…

重点!业内分享:如何找到自己门店的生鲜经营定位

说到经营生鲜品类 许多商超人士或许都会面临这样一个困境 即品类繁多且复杂,那么如何做到精准施策? 比如说,蔬菜和水果虽都归为生鲜,然而细分起来,价格和消费群体均存在差异。像蔬菜,价格通常较低&#…

2011-2022年 全国省级-农业绿色全要素生产率数据

农业绿色全要素生产率(Green Total Factor Productivity in Agriculture,简称GTFP-A)是一个重要的指标,它不仅衡量了农业部门的生产效率,还考虑了环境的可持续性与资源的利用效率。GTFP-A反映了农业生产过程中各种投入…

mprpc框架基础类的设计

目录 1.回顾 2.主函数书写 3.框架设计 3.1 mprpcapplication.h 3.2 rpcprovider.h 3.3 mprpcapplication.cc 3.4 mprpcprovider.cc 1.回顾 mprpc框架怎么用? 在上一节,我们完成了如何把本地服务发布成RPC服务。 我们打开example下callee下的users…

OpenAI突然宣布停止向中国提供API服务!套壳站不禁用国内IP访问,OpenAI将封禁API Key?意料之中还是意外之外?

关于猫头虎 大家好,我是猫头虎,别名猫头虎博主,擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评测图文、产品使用体验图文、产品优点推广文稿、产品横测对比文…

Java开发-实际工作经验和技巧-0002-Xshell中个人认为最实用的功能没有之一

Java开发-实际工作经验和技巧-0002-Xshell中个人认为最实用的功能没有之一 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技…