1、为啥要用指针?

原因如下:

  1. 避免数据拷贝—》在Go中,传递参数时,默认是值传递,这意味着会将变量的副本传递给函数。如果参数是大型数据结构(如切片、映射或结构体),则复制这些数据会消耗大量的内存和时间。使用指针可以避免这种性能开销,因为它只传递地址而不是整个数据
  2. 修改函数外的变量—》如果需要在函数中修改传入参数的值,可以使用指针。通过指针,函数可以直接操作传入的变量,从而改变它的值。
  3.  共享数据—》在并发程序中,多个 goroutine 可能需要访问和修改同一数据。使用指针可以确保对共享数据的修改是有效的。虽然在Go中可以使用通道来实现安全的并发,但指针在某些情况下仍然可以简化数据的共享

2、使用指针的注意事项

  1. 空指针检查

在使用指针之前,需要检查它是否为 nil,以避免运行时错误。对空指针进行解引用会导致程序崩溃

示例:

var ptr *int

if ptr != nil {

    fmt.Println(*ptr)

} else {

fmt.Println("指针为空")

}

2 循环引用

在某些情况下,指针可能导致循环引用,尤其是当结构体包含指向自身的指针时。虽然Go有垃圾回收机制,但循环引用依然可能导致内存泄漏。

3 理解指针的生命周期

使用指针时,需要注意指针指向的数据的生命周期。确保数据在使用指针时仍然有效,避免使用已释放或超出作用域的指针4. 何时使用指针


使用指针的场景:

当函数需要修改传入参数时。

当传入参数是大型数据结构时,以避免复制开销。

当需要共享状态或数据时。

避免使用指针的场景:

当数据很小(如基本数据类型)且不需要修改时,直接传递值更简单。

当需要确保数据不可变时,使用值传递可以避免意外修改。