golang指针介绍

2024-01-09 06:24:33

前言

简单记录下,GO语言中的指针类型和值类型的使用,以及二两之前的区别


指针类型介绍

在Go语言中,指针是一种特殊类型的变量,用于存储其他变量的内存地址。Go语言支持指针,但相对于一些其他编程语言,使用指针的频率较低,因为Go有垃圾回收机制,可以自动管理内存,减少了手动内存管理的需求。以下是一些关于Go语言指针的基本概念:

  1. 取地址符 &

    • 通过在变量前面加上 & 符号,可以获取该变量的内存地址。
    package main
    
    import "fmt"
    
    func main() {
        x := 42
        var ptr *int
        ptr = &x
        fmt.Println("Value of x:", x)
        fmt.Println("Address of x:", &x)
        fmt.Println("Value stored at the address:", *ptr)
    }
    
  2. 指针类型声明:

    • 使用 * 符号声明指针类型。例如,var ptr *int 表示 ptr 是一个指向 int 类型的指针。
    var ptr *int
    
  3. 零值(nil):

    • 指针的零值是 nil,表示该指针不指向任何有效的内存地址。
    var ptr *int // nil pointer
    
  4. 间接引用(解引用):

    • 使用 * 符号可以从指针中获取存储在相应内存地址上的值。这个过程叫做解引用。
    var x int = 42
    var ptr *int
    ptr = &x
    fmt.Println("Value stored at the address:", *ptr)
    
  5. 指针作为函数参数:

    • 可以将指针作为函数参数传递,从而可以在函数内部修改指针指向的值。
    package main
    
    import "fmt"
    
    func modifyValue(ptr *int) {
        *ptr = 100
    }
    
    func main() {
        x := 42
        fmt.Println("Before modification:", x)
        modifyValue(&x)
        fmt.Println("After modification:", x)
    }
    
  6. new 函数:

    • new 函数用于创建一个指向新分配的零值的指针。
    ptr := new(int)
    
  7. 不同类型的指针:

    • 可以有不同类型的指针,比如指向整数、浮点数或结构体的指针。
    var intPtr *int
    var floatPtr *float64
    var structPtr *MyStruct // 假设有一个结构体 MyStruct
    

指针在Go语言中用于处理一些特定的情况,比如在函数间传递大数据结构,或者需要直接修改某个变量的值而不是通过副本传递。然而,由于Go语言的垃圾回收机制,程序员在使用指针时不必过于担心内存管理问题。

值类型和指针类型的使用区别

在编程中,变量的类型可以分为值类型和指针类型,它们在使用和行为上有一些关键区别:

值类型(Value Types):

  1. 直接存储值:

    • 值类型的变量直接存储其值,而不是存储对内存中对象的引用。
  2. 独立的存储空间:

    • 每个值类型的变量都有自己的独立存储空间,对一个值的修改不会影响其他变量。
  3. 传递副本:

    • 当将值类型传递给函数或方法时,传递的是值的副本,而不是实际变量本身。
  4. 无需手动管理内存:

    • 对于大多数值类型,内存管理是自动的,不需要程序员手动进行内存分配或释放。
  5. 适用于简单数据结构:

    • 值类型适用于简单的数据结构,如基本数据类型(int、float、bool等)和结构体。

指针类型(Pointer Types):

  1. 存储内存地址:

    • 指针类型的变量存储的是另一个变量的内存地址。
  2. 共享存储空间:

    • 多个指针变量可以指向同一块内存地址,它们共享相同的存储空间。修改一个指针的值会影响其他指向相同地址的指针。
  3. 传递引用:

    • 当将指针类型传递给函数或方法时,传递的是内存地址的引用,允许在函数内修改原始变量的值。
  4. 需要手动管理内存:

    • 指针通常需要手动进行内存管理,包括分配和释放内存,特别是在一些低级语言中,如C和C++。
  5. 适用于动态数据结构:

    • 指针类型更适用于动态数据结构,如链表、树等,以及在需要直接操作内存时的情况。

示例:

值类型的使用:
package main

import "fmt"

func main() {
    x := 10 // 值类型
    y := x  // 创建副本
    y = 20  // 修改 y 不影响 x
    fmt.Println(x) // 输出: 10
}
指针类型的使用:
package main

import "fmt"

func main() {
    x := 10      // 值类型
    ptr := &x    // 指向 x 的指针
    *ptr = 20    // 通过指针修改 x 的值
    fmt.Println(x) // 输出: 20
}

选择值类型还是指针类型取决于具体的需求。通常,对于简单的数据结构和函数参数传递,值类型更为方便。对于需要共享数据、动态分配内存或需要直接操纵内存的情况,指针类型可能更为适用。

文章来源:https://blog.csdn.net/u010844836/article/details/135464425
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。