Golang的引用类型和指针的使用与区别

 更新时间:2025年02月17日 10:17:59   作者:星星点点洲  
本文详细介绍了Golang中的引用类型和指针的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在Golang中,引用类型和指针是两个容易混淆的概念,但它们有本质的区别。理解它们的区别对于编写高效、正确的Go代码至关重要。

1. 引用类型

引用类型是Go语言中某些内置类型的统称,它们的值在传递时共享底层数据,而不是复制数据。Go中的引用类型包括:

  • Slice(切片)
  • Map(映射)
  • Channel(通道)
  • Function(函数)
  • Interface(接口)

特点:

  • 共享底层数据:传递引用类型时,传递的是对底层数据的引用,而不是数据的副本。
  • 无需显式解引用:直接操作引用类型即可修改底层数据。
  • 零值为nil:引用类型的零值是nil,表示未初始化。

示例:

func modifySlice(s []int) {
    s[0] = 100 // 修改底层数据
}

func main() {
    s := []int{1, 2, 3}
    modifySlice(s)
    fmt.Println(s) // 输出: [100, 2, 3]
}
  • s是切片(引用类型),传递给modifySlice时共享底层数组,修改会反映到原切片。

2. 指针

指针是一个变量,存储的是另一个变量的内存地址。通过指针可以间接访问或修改目标变量的值。

特点:

  • 显式解引用:需要通过*操作符访问目标变量的值。
  • 零值为nil:未初始化的指针值为nil
  • 传递地址:指针传递的是变量的地址,而不是值本身。

示例:

func modifyInt(p *int) {
    *p = 100 // 解引用并修改目标变量的值
}

func main() {
    x := 10
    modifyInt(&x) // 传递x的地址
    fmt.Println(x) // 输出: 100
}
  • p是指针,存储的是x的地址,通过*p修改x的值。

3. 引用类型 vs 指针

特性引用类型指针
本质内置类型(如切片、映射)存储变量地址的变量
传递方式共享底层数据传递变量的地址
解引用无需显式解引用需要显式解引用(*操作符)
零值nilnil
适用场景需要共享底层数据的场景(如切片、映射)需要直接修改变量值的场景

4. 常见误区

误区1:切片是指针

  • 错误理解:切片是引用类型,但它本身是一个结构体(包含指向底层数组的指针、长度和容量),而不是指针。
  • 正确理解:切片传递时共享底层数组,但切片本身是按值传递的(复制了结构体)。

误区2:引用类型不需要指针

  • 错误理解:引用类型已经共享底层数据,因此不需要指针。
  • 正确理解:引用类型在传递时共享数据,但如果需要修改引用类型本身(如重新分配切片),则需要使用指针。

示例:

func reassignSlice(s *[]int) {
    *s = []int{4, 5, 6} // 修改切片本身
}

func main() {
    s := []int{1, 2, 3}
    reassignSlice(&s) // 传递切片的指针
    fmt.Println(s) // 输出: [4, 5, 6]
}
  • 这里需要传递切片的指针,因为需要修改切片本身(重新分配)。

5. 总结

  • 引用类型:共享底层数据,适合传递大数据结构(如切片、映射)。
  • 指针:传递变量地址,适合需要直接修改变量值的场景。
  • 选择依据:
    • 如果需要共享数据,优先使用引用类型。
    • 如果需要修改变量本身(如重新分配),使用指针。

理解这两者的区别有助于编写更高效、更清晰的Go代码。

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

相关文章

  • Golang学习笔记(四):array、slice、map

    Golang学习笔记(四):array、slice、map

    这篇文章主要介绍了Golang学习笔记(四):array、slice、map,本文分别讲解了这3个类型的声明&赋值、元素访问、其它操作,需要的朋友可以参考下
    2015-05-05
  • Golang使用channel实现一个优雅退出功能

    Golang使用channel实现一个优雅退出功能

    最近补 Golang channel 方面八股的时候发现用 channel 实现一个优雅退出功能好像不是很难,之前写的 HTTP 框架刚好也不支持优雅退出功能,于是就参考了 Hertz 优雅退出方面的代码,为我的 PIANO 补足了这个 feature
    2023-03-03
  • golang redis中Pipeline通道的使用详解

    golang redis中Pipeline通道的使用详解

    本文主要介绍了golang redis中Pipeline通道的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Golang中数据结构Queue的实现方法详解

    Golang中数据结构Queue的实现方法详解

    这篇文章主要给大家介绍了关于Golang中数据结构Queue的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • CentOS7使用yum安装Golang的超详细步骤

    CentOS7使用yum安装Golang的超详细步骤

    CentOS默认并没有安装golang运行环境,下面这篇文章主要给大家介绍了关于CentOS7使用yum安装Golang的超详细步骤,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Go处理JSON数组字符串的常用第三方库代码示例

    Go处理JSON数组字符串的常用第三方库代码示例

    在Go语言中,处理JSON数组是一项常见的任务,JSON(JavaScript Object Notation)是一种常用的数据交换格式,而数组是其中一种重要的数据结构,本文将介绍如何使用Go语言处理JSON数组字符串,并提供相应的源代码和描述,需要的朋友可以参考下
    2025-09-09
  • 详解如何在Go服务中做链路追踪

    详解如何在Go服务中做链路追踪

    使用 Go 语言开发微服务的时候,需要追踪每一个请求的访问链路,本文主要介绍了如何在Go 服务中做链路追踪,感兴趣的可以了解一下
    2021-09-09
  • Go函数全景从基础到高阶深度剖析

    Go函数全景从基础到高阶深度剖析

    本文深入探索Go语言中的函数特性,从基础函数定义到特殊函数类型,再到高阶函数的使用和函数调用优化,通过详细的代码示例和专业解析,读者不仅可以掌握函数的核心概念,还能了解如何在实践中有效利用这些特性来提高代码质量和性能
    2023-10-10
  • Golang 按行读取文件的三种方法小结

    Golang 按行读取文件的三种方法小结

    本文主要介绍了Golang 按行读取文件的三种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go使用fmt包输出与格式化核心库的完整指南

    Go使用fmt包输出与格式化核心库的完整指南

    在 Go 语言中,fmt 是最基础也是使用频率最高的标准库之一,几乎每一个 Go 程序都会用到它,下面小编就和大家详细介绍一下fmt包的具体使用吧
    2026-03-03

最新评论