6.5 Go 指针


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

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

  • 专栏导航

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

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

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

    📒文章目录

      • 指针基础
        • 声明和初始化指针
        • 指针与数组
      • 指针的高级使用技巧
        • 指针与结构体
        • 指针传递与逃逸分析
        • 指针与接口
        • 指针与并发
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
在 Go 语言中,指针是实现高效内存管理和数据共享的关键工具。对于中高级开发者而言,掌握指针的使用不仅能够提升程序的性能,还能增强代码的灵活性和可读性。本文将深入探讨 Go 指针的高级使用技巧,帮助开发者在实际工作中更好地利用这一特性。

指针基础

在 Go 中,指针是一个变量,它存储了另一个变量的内存地址。通过指针,我们可以间接访问和修改变量的值。Go 语言的指针类型定义为 *T,其中 T 是指针指向的变量类型。

声明和初始化指针

var p *int    // 声明一个指向 int 类型的指针 p
p = new(int)  // 初始化指针 p,分配一个 int 类型的内存空间
*p = 10       // 通过指针 p 设置变量的值为 10
fmt.Println(*p) // 输出:10

指针与数组

数组在 Go 中是值类型,当数组作为函数参数传递时,实际上是传递了数组的一个副本。为了在函数内部修改数组,我们通常使用指针。

func increment(arr *[5]int) {
    for i := 0; i < len(*arr); i++ {
        (*arr)[i]++
    }
}

func main() {
    myArr := [5]int{1, 2, 3, 4, 5}
    increment(&myArr)
    fmt.Println(myArr) // 输出:[2 3 4 5 6]
}

指针的高级使用技巧

指针与结构体

结构体是 Go 中实现面向对象编程特性的一种方式。通过指针,我们可以在不改变结构体大小时,实现对结构体成员的修改。

type Person struct {
    Name string
    Age  int
}

func (p *Person) Greet() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

func main() {
    person := Person{Name: "Alice", Age: 30}
    personPtr := &person
    personPtr.Greet() // 使用指针调用方法
}

指针传递与逃逸分析

Go 编译器会进行逃逸分析(escape analysis),以决定变量应该分配在栈上还是堆上。当变量作为指针传递给函数时,如果函数内部对指针指向的值进行了修改,该变量可能会被分配到堆上,以避免栈溢出。

func modifySlice(slice *[]int) {
    *slice = append(*slice, 10)
}

func main() {
    mySlice := []int{1, 2, 3}
    modifySlice(&mySlice)
    fmt.Println(mySlice) // 输出:[1 2 3 10]
}

指针与接口

接口在 Go 中是一种动态类型,它允许我们编写更灵活的代码。通过指针,我们可以在接口中传递和修改数据。

type Animal interface {
    MakeSound()
}

type Dog struct {
    Name string
}

func (d *Dog) MakeSound() {
    fmt.Println(d.Name, "says Woof!")
}

func main() {
    dog := Dog{Name: "Buddy"}
    animal := Animal(&dog) // 接口作为指针传递
    animal.MakeSound()     // 输出:Buddy says Woof!
}

指针与并发

在 Go 的并发编程中,指针的使用可以避免数据竞争,因为每个 goroutine 可以有自己的栈,但它们共享指针指向的堆内存。

func worker(id int, data *int) {
    *data += id
}

func main() {
    var sharedData int
    for i := 0; i < 5; i++ {
        go worker(i, &sharedData)
    }
    time.Sleep(1 * time.Second) // 等待所有 goroutine 完成
    fmt.Println(sharedData) // 输出:10
}

总结

指针是 Go 语言中一个强大而灵活的特性,它允许开发者以更高效的方式处理数据。通过深入理解指针的工作原理和高级使用技巧,开发者可以编写出性能更优、更易于维护的代码。


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

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

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

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

相关文章

微信小程序上架,AI类目审核(AI问答、AI绘画、AI换脸)

小程序对于生成式AI类目的产品上架审核较为严格&#xff0c;这也是近两年新增了几个类目&#xff0c;一旦小程序中涉及生成式AI相关的内容&#xff0c;如果你选择相应类目&#xff0c;但审核被划归为这一类&#xff0c;都需要准备此类目的审核&#xff0c;才能正常上架。 如果…

Open3D(C++) Ransac拟合多项式曲线

目录 一、算法原理一、代码实现三、结果展示本文由CSDN点云侠原创,Open3D(C++) Ransac拟合多项式曲线,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 RANSAC(Random Sample Consensus)是一种用于拟合模型的迭…

dockers安装mysql

1.dockerhub上搜索自己需要安装得镜像版本 dockerhub网址&#xff1a;https://hub-stage.docker.com docker pull mysql:5.7 #下载自己需要得版本2.启动容器实例&#xff0c;并且挂载容器数据卷 docker run -d -p 3306:3306 --privilegedtrue \ -v /home/mysql/log:/var/log/…

WireShark抓包软件的使用 上海商学院 计算机网络 实验作业3

实验目的 &#xff08;1&#xff09;熟悉wireShark软件操作界面和操作步骤&#xff1b; &#xff08;2&#xff09;学会捕获过滤器的设置方法&#xff1b; &#xff08;3&#xff09;学会显示过滤器的设置方法&#xff1b; &#xff08;4&#xff09;学会使用捕获报文的统计…

全栈工程师需要具备哪些技能?

概论&#xff1a; 全栈工程师是一位能够从头到尾构建 Web 应用程序的工程师&#xff0c;能独立完成产品。技术包括前端部分、后端部分和应用程序所在的基础架构。他们在整个技术栈中工作&#xff0c;并了解其中的每个部分。从需求分析开始&#xff0c;到概要设计&#xff0c;详…

【计算机网络】——物理层(图文并茂)

物理层 一.物理层概述1.物理层要实现的功能2.物理层接口特征1.机械特性2.电气特性3.功能特性4.过程特性 二.物理层下面的传输媒体1.传输媒体的分类2.导向型传输媒体1.同轴电缆2.双绞线3.光纤 3.非导向型传输媒体1.无线电波2.微波3.红外线4.激光5.可见光 三.传输方式1.串行传输与…

小学数学出题器-Word插件-大珩助手

Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&#xff0c;从而打造出专业而精美的文档。 【新功能】小学数学出题器 1、实现了难度设定&#xff1b;…

生成ssh密钥,使用ssh连接linux系统

这里写目录标题 ssh密钥大概介绍1、密钥在哪里生成&#xff08;客户端/服务器&#xff09;&#xff1f;2、密钥生成是什么样子的&#xff1f; ssh &#xff08;生成密钥、密钥传输、配置连接、连接服务&#xff09;过程1、生成密钥提示一&#xff1a;输入保存密钥的文件&#x…

知名专业定制线缆知名智造品牌推荐-精工电联:解决水下机器人线缆行业痛点的领航者

在科技日新月异的今天&#xff0c;精工电联作为高科技智能化产品及自动化设备专用连接线束和连接器配套服务商&#xff0c;致力于为高科技行业提供高品质、高性能的集成线缆和连接器定制服务。我们不仅是高品质定制线缆供应商&#xff0c;更是水下机器人线缆行业痛点的有效解决…

Linux静态库与动态库加载

了解库&#xff1a; 关于库相比大家之前肯定使用过&#xff0c;比如C/C里面的标准库&#xff0c;STL里面的各种库&#xff0c;我们在调用STL里的容器时都需要使用库&#xff0c;那么库到底是什么呢&#xff1f; 库的本质就是可执行程序的"半成品" 我们先来回顾一下代…

html中table 的边框合并 cellspacing

cellspacing中的数值代表单元格间距 cellspacing“0”代表没有间距&#xff0c;也是常用的方式 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> </head> <body><h4>没有单元格间…

python实现——综合类型数据挖掘任务(无监督的分类任务)

综合类型数据挖掘任务 航空公司客户价值分析。航空公司客户价值分析。航空公司客户价值分析。航空公司已积累了大量的会员档案信息和其乘坐航班记录&#xff08;air_data.csv&#xff09;&#xff0c;以2014年3月31日为结束时间抽取两年内有乘机记录的所有客户的详细数据。利用…

Python使用动态代理的多元应用

Python作为一种功能强大且易于学习的编程语言&#xff0c;在网络编程领域具有广泛的应用。当Python与动态代理技术结合时&#xff0c;便开启了一扇通往更多可能性的大门。以下将深入探讨Python使用动态代理可以实现的多种应用。 首先&#xff0c;Python结合动态代理在网络爬虫…

WebRTC 各端的互联互通

WebRTC 各端的互联互通 WebRTC 各端的互联互通WebRTC Native 的核心一对一通信的时序图发起通话接收通话关闭通话 Android 端的实现iOS 端的实现各开发方案的比较参考 WebRTC 各端的互联互通 WebRTC Native 的核心 正如 WebRTC Web 端的核心是 RTCPeerConnection&#xff0c;…

自适应全屏滚动,实现swiper 全屏滚动效果与解决bug

原来是想复刻明日方舟的滚动代码&#xff0c;基于此进行开发 js实现网页全屏切换&#xff08;平滑过渡&#xff09;&#xff0c;鼠标滚动切换_网页滚动条下滑和全屏切换是什么-CSDN博客 但是发现bug BUG 原因是只获取了一次高度 于是增加窗口监听&#xff0c; 但是发现拉伸…

C语言王国——杨氏矩阵

目录 1. 引言 2. 了解杨氏矩阵 3. 思路分析 4. 代码 5. 总结 1. 引言 最近在做二维数组的训练的时候发现了一个很有意思的题&#xff1a; 一看这不是杨氏矩阵嘛&#xff0c;接下来就由姜糖我带大家了解一下这个著名的矩阵。 2. 了解杨氏矩阵 通过查阅百度得知&#xff1a; …

电脑如何开启硬件虚拟化?这 2 种方法都可以使用

开启硬件虚拟化的方法 我们应该如何开启硬件虚拟化呢&#xff1f;下面就为大家总结了 2 种开启电脑硬件虚拟化的方法。 WinRE 启用 我们可以通过 Windows 恢复环境也就是 WinRE 在UEFI 或者 BIOS 上开启硬件虚拟化&#xff0c;大家可以按照下面的步骤进行操作。 首先打开设…

【Python】解决Python报错:AttributeError: ‘int‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

Prometheus + Grafana + Alertmanager 系统监控

PrometheusGrafana 系统监控 1. 简介1.1 Prometheus 普罗 米修斯1.2 Grafana 2. 快速试用2.1 Prometheus 普罗 米修斯2.2 Prometheus 配置文件2.3 Grafana 2. 使用 Docker-Compose脚本部署监控服务3. Grafana 配置3.1 配置数据源 Prometheus3.2 使用模板ID 配置监控模板3.3 使用…

SpringBoot 单元测试 指定 环境

如上图所示&#xff0c;在配置窗口中添加--spring.profiles.activedev&#xff0c;就可以了。