Go语言中,一会有有*,一会儿没有,请问我们应该如何判断合适使用*与否?

Go语言中,一会有有*,一会儿没有,请问我们应该如何判断合适使用*与否?

cidr := make([]*router.CIDR, 0, 16)
cidr := make([]router.CIDR, 0, 16)
阅读 1.2k
3 个回答

你需要打好一下基础了,你所谓的* 其实是go中的 指针运算符 , 它可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 ,也就是这个地址所存储的值

根据你的需求来。指针是存储变量在内存中的地址。

  • 如果一个方法需要修改传入的参数值,则可以通过传入指针。比如简单的数据类型它们在go中是值传递的,想修改他们就只能通过指针。

    func changeValue(a *string, b *string) {
      *a += *b
    }
    
    func main() {
      a := "Hello"
      b := " World"
      changeValue(&a, &b)
      fmt.Println(a)    // Hello World
    }
  • 对于大对象的类型像数组、结构体等等,传递指针可以提高性能,避免频繁的对象拷贝。
  • 如果需要通过多个函数传递一个对象,这时候要传递指针更方便。
  • 还有一些类型转换,比如字节转字符串

    func BytesToString(b []byte) string {
      return *(*string)(unsafe.Pointer(&b))
    }
  • 如果一个值或者对象在程序的整个生命周期不需要修改,则可以直接使用对象,那么就不需要使用指针
  • 大多数场景下并不太用得到传递指针
推荐问题