📜  比较 Golang 中的指针(1)

📅  最后修改于: 2023-12-03 15:11:00.808000             🧑  作者: Mango

比较 Golang 中的指针

在 Golang 中,指针是一种非常重要的数据类型。指针是为了能在函数间传递变量而存在的,与其他常见高级语言(如 C/C++)中的指针类似。本文将介绍 Golang 中指针的基础知识,以及 Golang 中指针和其他语言的指针的一些异同点。

Golang 中的指针

在 Golang 中,使用 & 符号可以获取一个变量的地址,使用 * 符号可以获取指针所指向的变量。例如:

num := 10
numAddr := &num  // 获取变量 num 的地址
fmt.Println(*numAddr)  // 输出变量 num 的值

在上述代码中,numAddrnum 的指针,可以通过 *numAddr 获取 num 的值。

如果变量是一个指针类型,那么可以通过 * 符号获取指针所指向的值。例如:

str := "hello"
strPtr := &str

fmt.Println(*strPtr)  // 输出 "hello"
与 C/C++ 中指针的异同点

与 C/C++ 中指针不同,Golang 中的指针不支持进行指针运算,即不支持指针加减操作。除此之外,Golang 还提供了自动垃圾回收机制(GC),避免了内存泄漏等问题。这也是 Golang 中指针使用较为安全的原因之一。

另外,Golang 中的指针类型可以为任何类型的指针。例如,可以定义一个 *int 类型的指针,也可以定义一个 *string 类型的指针。

使用指针的场景

指针最常见的使用场景就是在函数间传递大型变量,例如数组、结构体等。将这些变量传递给函数作为参数时,会将整个变量复制一遍,导致性能问题。而传递指针则可以避免这个问题,因为指针只是一个小的数据类型。

具体例子可以看下面的代码:

type person struct {
    name string
    age  int
}

func main() {
    p := person{name: "Tom", age: 18}
    fmt.Println(p.name, p.age)
    change(&p)
    fmt.Println(p.name, p.age)
}

func change(p *person) {
    p.name = "Jerry"
    p.age = 20
}

在上述代码中,change 函数接收了一个 *person 类型的指针,通过修改指针所指向的变量 p 的值修改了传入的 person 变量的值。这样可以避免将整个 person 变量复制一遍,提高程序性能。

总结

本文介绍了 Golang 中指针的基础知识,以及 Golang 中指针和其他语言的指针的一些异同点。通过了解指针的使用场景,可以更好地使用指针来提高程序性能。