首页 > 其他分享 >15分钟学 Go 第 12 天:指针基础

15分钟学 Go 第 12 天:指针基础

时间:2024-10-21 10:21:23浏览次数:9  
标签:12 15 int fmt Println Go ptr 指针

第12天:指针基础

学习目标

在本节课中,我们将深入了解Go语言中的指针概念及其用法,帮助你理解如何使用指针来优化内存管理和提高程序性能。

一、指针概念

指针是一个变量,它存储另一个变量的内存地址。在Go语言中,指针有助于实现以下目标:

  • 提高性能:通过传递指针而非复制值,可以节省内存空间。
  • 间接访问:允许你间接访问和修改数据。

二、指针的基本语法

  1. 声明指针:使用 * 符号来声明一个指针类型。
  2. 获取地址:使用 & 符号获取变量的内存地址。
  3. 解引用:使用 * 符号解引用指针,访问指针所指向的值。

三、指针的基本用法

3.1 声明指针
var ptr *int
3.2 获取地址
x := 42
ptr = &x // ptr现在指向x的内存地址
3.3 解引用
fmt.Println(*ptr) // 输出 42
*ptr = 100       // 修改x的值为100
fmt.Println(x)   // 输出 100

四、指针的重要特性

特性描述
零值指针指针的零值是 nil,表示没有指向任何有效的内存
指针可以被锁定Go语言中的指针可以被作为函数参数传递,保持其锁定
不同类型的指针可声明指向不同数据类型的指针

五、指针与值的比较

在Go中,值类型和引用类型的主要区别在于内存管理:

  • 值类型:例如 int, float, bool 等,通常发生值的复制。
  • 引用类型:例如,指针、切片、映射和通道,传递的是对实际数据的引用。
例子对比
func modifyValue(val int) {
    val = 100 // 这个修改不会影响main中的x
}

func modifyPointer(ptr *int) {
    *ptr = 100 // 这个修改会影响main中的x
}

func main() {
    x := 42
    modifyValue(x)
    fmt.Println(x) // 输出 42

    modifyPointer(&x)
    fmt.Println(x) // 输出 100
}

六、指针的使用场景

  1. 函数参数传递

    • 可以减少内存消耗。
    • 修改函数外的变量。
  2. 构建链表、树等数据结构

    • 必须使用指针来建立节点间的关系。

七、指针的安全性

Go是注重安全性的语言,指针的使用要谨慎:

  • 使用 nil 前应判断指针是否为 nil
  • 不要解引用 nil 指针。

八、代码示例与运行流程

示例代码:使用指针进行数据修改

package main

import "fmt"

func updateValue(x *int) {
    *x = 50 // 更新指针指向的值
}

func main() {
    value := 10
    fmt.Println("Before update:", value) // 输出 10
    updateValue(&value)                   // 传递指针
    fmt.Println("After update:", value)   // 输出 50
}

运行流程图

+---------------------------+
|         main             |
+---------------------------+
| value := 10              |
| print 10                 |
| updateValue(&value)      |
|---------------------------|
|                           |
| +----------------------+  |
| |     updateValue     |  |
| +----------------------+  |
| x := *int (指向value)   |
| *x = 50 (改变value)   |
|                          |
+---------------------------+

九、指针的进阶用法

9.1 使用多重指针

多重指针是指向指针的指针,例如 **int,用于复杂的数据结构:

func main() {
    var x int = 10
    var px *int = &x         // px是指向x的指针
    var ppx **int = &px      // ppx是指向px的指针
    fmt.Println(**ppx) // 输出 10
}
9.2 nil指针的处理

在进行指针操作时,务必要检查指针是否为 nil

var ptr *int
if ptr != nil {
    fmt.Println(*ptr) // 安全访问
} else {
    fmt.Println("ptr is nil")
}

十、总结

指针在Go语言中是一个强大而重要的工具。通过理解指针的概念、用法及其在各种场景下的应用,你可以更深入地掌握Go语言,为编写高效、可维护的程序奠定基础。

十一、实践与作业

在了解指针的基础上,试着完成以下练习:

  1. 编写函数,接受指向整型数组的指针,计算并返回数组的总和。
  2. 实现链表,包括插入、删除和打印功能,使用指针来连接节点。

怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

标签:12,15,int,fmt,Println,Go,ptr,指针
From: https://blog.csdn.net/weixin_40780178/article/details/143104651

相关文章

  • 15分钟学 Go 第 11 天:变量作用域
    第11天:变量作用域目标:学习局部和全局变量在Go语言中,变量的作用域决定了变量的可见性和生命周期。理解变量的作用域对于有效编写和组织代码至关重要。此次内容将涵盖局部变量和全局变量的定义、使用、作用域规则以及注意事项。1.什么是变量作用域变量作用域是一个变量可......
  • 在小红书上用AI数字人做心理学赛道,15天涨1.6万粉
    家人们!说实话,用AI数字人带货确实是对于普通人变现最快的项目,但对于AI数字人玩法,许多小伙伴还只是停留在单纯做视频带货的认知层面。但对于高阶玩家,早于将AI数字人si域变现,玩得如火纯青了。si域高客单转化,才是真正的变现无上限,且复购率强。最典型案例就是通过数字人,引流si......
  • Springboot计算机毕业设计仓储线上管理系统7te15
    Springboot计算机毕业设计仓储线上管理系统本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,员工,材料信息,材料入库,材料出库,供应商,商品信息,商品类型,订单信息,利润信息,材料盘点,商品盘点开......
  • 你为什么不应该过度关注go语言的逃逸分析
    逃逸分析算是go语言的特色之一,编译器自动分析变量/内存应该分配在栈上还是堆上,程序员不需要主动关心这些事情,保证了内存安全的同时也减轻了程序员的负担。然而这个“减轻负担”的特性现在却成了程序员的心智负担。尤其是各路八股文普及之后,逃逸分析相关的问题在面试里出现的频率......
  • Java 代码里如何设置,可以让程序仅仅从 MongoDB 的主节点读写,而不从从节点读写
    在Java中,如果你希望仅从MongoDB的主节点(primarynode)进行读写操作,而避免从从节点(secondarynodes)读写,可以通过以下方式配置MongoDB客户端:1.使用ReadPreference.primary()配置MongoDB提供了ReadPreference类来定义客户端的读偏好。默认情况下,ReadPreference.primary(......
  • P11217 【MX-S4-T1】「yyOI R2」youyou 的垃圾桶(线段树上二分)
    link赛时是想到普通的线段树+二分\(O(q\log^2n)\),预期是70pts,实际50pts后面发现又是在longlong类型的计算中,1ll写成了1,然后爆负数,复杂度就错了,T了四个点开题,读起来是一个很套路的题目要对区间在线修改,区间加、(区间乘?),发现数据很大,那就是线段树、树状数组维护了思......
  • PHP蔬菜水果销售系统-毕业设计源码09153
     摘 要本项目旨在基于PHP开发设计一个蔬菜水果销售系统,旨在为农产品销售行业提供一个高效的电子商务平台。该系统将包括商品展示、在线购买、订单管理、支付功能等,以满足消费者的购物需求。通过PHP编程语言,结合数据库管理和网页设计技术,实现系统的设计与开发。该项目......
  • P11211 随机数生成器 题解
    前置知识:原根,exCRT。首先\(t=1\)是容易的,直接相邻的除一下即可。否则考虑询问除连续的\(5\)个数,分别为\(a_0,a_1,\cdots,a_4\)。首先特判掉存在\(a_i=0\)的情况,此时直接枚举\(s\)即可。我们先求出\(p\)的一个原根\(g\),设离散对数\(\log(x)=y\)表示\(g^y\equiv......
  • 2024-10-19:用go语言,给定一个正整数 k 和初始数组 nums = [1], 可以执行两种操作:将数组
    2024-10-19:用go语言,给定一个正整数k和初始数组nums=[1],可以执行两种操作:将数组中任一元素加一,或复制数组中任意元素并将其附加到数组末尾。求使得数组元素之和大于或等于k所需的最少操作次数。输入:k=11。输出:5。解释:可以对数组nums=[1]执行以下操作:将元......
  • GO项目的打包和部署
    项目打包和部署在Go语言中,打包和部署应用非常简单,因为Go编译生成的可执行文件不依赖外部环境。以下是打包发布和部署Go应用的几种常见方式,以及一些最佳实践。1.基本的打包和构建构建可执行文件你可以通过gobuild命令将你的应用打包成一个可执行文件:gobuild-oy......