Go指针的具体使用

 更新时间:2023年11月20日 11:40:37   作者:hope_wisdom  
本文主要介绍了Go指针的具体使用,包括使用指针、空指针、指针数组、指向指针的指针等,具有一定的参考价值,感兴趣的可以了解一下

概述

上一节的内容中,我们介绍了Go的切片,包括:声明切片、初始化切片、切片的切割、切片的添加、切片的删除、切片的复制、切片的遍历、多维切片等。在本节中,我们将介绍Go的指针。Go语言中的指针是一种特殊的数据类型,它存储了一个变量的内存地址。指针允许我们通过这个内存地址直接访问该变量的值,当然,也可以修改该变量的值。指针在Go语言中经常用于优化性能、处理复杂数据结构以及实现高级功能。

使用指针

在Go语言中,可以使用*符号来声明指针。指针是一个变量,它存储了另一个变量的内存地址。通过使用指针,可以直接访问指向的变量的值,而无需使用实际变量的名称。声明指针变量的语法如下:

var ptr *type

其中,ptr是指针变量的名称,type是指针指向的变量的类型。

要获取变量的地址并将其赋值给指针变量,可以使用&运算符。

var num int = 99
// 声明一个指向int类型的指针变量
var ptr *int = &num

要使用指针访问变量的值,可以使用*运算符对指针进行解引用。

var num2 int = *ptr

在下面的示例代码中,我们声明了一个整数变量num,并赋值为99。然后,声明了一个指向int类型的指针ptr,并将num的内存地址赋给了它,打印ptr的值将输出指向的变量的内存地址。通过使用*运算符对指针进行解引用,我们可以获取指向的值99。最后,我们通过指针修改了变量的值,将100赋值给了它。再次打印num的值,将输出修改后的值100。

package main
  
import "fmt"
  
func main() {
    var num int = 99
    // 声明一个指向int类型的指针变量
    var ptr *int = &num

    // 输出num的值:99
    fmt.Println(num)
    // 输出指针的值,即变量num的内存地址:0xc00000a0d8
    fmt.Println(ptr)
    // 解引用指针,获取ptr指向的值,实际上就是num,输出:99
    fmt.Println(*ptr)

    // 通过指针修改变量的值,因为指针指向num,故也会修改num,输出:100
    *ptr = 100
    fmt.Println(num)
}

注意:使用Go语言中的指针需要小心,一旦使用不当,就可能会导致内存泄漏或其他问题。

空指针

空指针,是指指针没有指向任何变量,其值为nil。当一个指针被定义后没有分配到任何变量时,它的值即为nil。nil在概念上与其它语言的null、None、nil、NULL一样,都表示零值或空值。

package main

import "fmt"

func main() {
   var  ptr *int
    // ptr未指向任何变量,输出:ptr is 0
   fmt.Printf("ptr is %x\n", ptr)

   // 判断ptr是否为空指针
   if ptr == nil {
        fmt.Println("ptr is nil")
   } else {
        fmt.Println("ptr is not nil")
   }
}

指针数组

Go语言的指针数组是一种特殊的数组类型,其中每个元素都是一个指针,可以指向相同类型的变量。要声明一个指针数组,可以使用[]*T语法,其中T表示指针所指向的变量类型。比如:要声明一个指向整数类型的指针数组,可以使用以下代码。

var arrPtr []*int

这将声明一个名为arrPtr的指针数组,其中每个元素都是一个指向整数类型的指针。

要初始化指针数组,可以使用make函数创建一个指定长度的指针数组,并将指针初始化为nil。在下面的示例代码中,我们将创建一个长度为5的指针数组arrPtr,并将每个元素初始化为nil。

arrPtr:= make([]*int, 5)

在下面的示例代码中,我们进一步演示了指针数组的用法。首先声明了指针数组arrPtr ,并将arrNum每个元素的内存地址赋值给arrPtr的元素。接下来,遍历arrPtr的每个指针,并修改指针指向元素的值为原值的10倍。最后,我们遍历arrPtr的每个指针,输出指针指向的元素值和对应arrNum元素的值。

package main

import "fmt"

func main() {
    arrNum := [3]int{66, 88, 99}
    // 将每个变量的地址赋值给指针数组的元素
    arrPtr := [3]*int{&arrNum[0], &arrNum[1], &arrNum[2]}
    
    // 通过指针数组访问和修改变量的值
    for i := 0; i < len(arrPtr); i++ {
        *arrPtr[i] = *arrPtr[i] * 10
    }

    // 输出修改后的变量值,分别为:660 880 990
    for i := 0; i < len(arrPtr); i++ {
        fmt.Printf("*arrPtr[%d] = %d, arrNum[%d] = %d\n", i, *arrPtr[i], i, arrNum[i])
    }
}

指向指针的指针

在Go语言中,可以定义指向指针的指针,这种指针类型允许你存储和处理指针的指针。要声明一个指向指针的指针,我们可以使用**T语法,其中T表示指针所指向的变量类型。

在下面的示例代码中,指针pNum指向了num,ppNum指向了pNum。通过*pNum和**ppNum,可以访问到真正指向的元素num。

package main

import "fmt"

func main() {
    var num int = 666
    var pNum *int = &num
    var ppNum **int = &pNum
    // 输出:666 666 666
    fmt.Println(num, *pNum, **ppNum)
}

到此这篇关于Go指针的具体使用的文章就介绍到这了,更多相关Go指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你熟悉Go语言中的分支结构

    一文带你熟悉Go语言中的分支结构

    这篇文章主要和大家分享一下Go语言中的分支结构(if - else-if - else、switch),文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-11-11
  • Go语言使用漏桶算法和令牌桶算法来实现API限流

    Go语言使用漏桶算法和令牌桶算法来实现API限流

    为防止服务器被过多的请求压垮,限流是一个至关重要的技术手段,下面我们就来看看如何使用漏桶算法和令牌桶算法来实现 API 的限流吧
    2024-11-11
  • Go 实战单队列到优先级队列实现图文示例

    Go 实战单队列到优先级队列实现图文示例

    这篇文章主要为大家介绍了Go 实战单队列到优先级队列图文示例实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • etcd通信接口之客户端API核心方法实战

    etcd通信接口之客户端API核心方法实战

    这篇文章主要为大家介绍了etcd通信接口之客户端API核心方法实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言使用ioutil.ReadAll函数需要注意基本说明

    Go语言使用ioutil.ReadAll函数需要注意基本说明

    这篇文章主要为大家介绍了Go语言使用ioutil.ReadAll函数需要注意基本说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Go语言中的自定义类型你了解吗

    Go语言中的自定义类型你了解吗

    自定义类型是 Go 语言中非常重要的概念之一,通过自定义类型,我们可以更好地封装数据、组织代码,提高程序的可读性和可维护性。本文将从以下几个方面介绍 Go 自定义类型的相关知识,感兴趣的可以了解一下
    2023-04-04
  • 一起聊聊Go语言中的语法糖的使用

    一起聊聊Go语言中的语法糖的使用

    语法糖通常是用来简化代码编写的,特性就是使用语法糖前后编译的结果是相同的。这篇文章主要就来和大家一起聊聊Go语言中的语法糖的实现
    2022-07-07
  • Go语言Gin处理响应方式详解

    Go语言Gin处理响应方式详解

    gin框架封装了常用的数据格式方法响应于客户端,下面这篇文章主要给大家介绍了关于Go语言Gin处理响应方式的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Windows下升级go版本过程详解

    Windows下升级go版本过程详解

    这篇文章主要为大家介绍了Windows下升级go版本过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • golang内存逃逸分析

    golang内存逃逸分析

    本文主要介绍了golang内存逃逸分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06

最新评论