Go指针

虽然Go吸收融合了很多其语言中的各种特性,但是Go主要被归入C语言家族。其中一个重要的原因就是Go和C一样,也支持指针。 当然Go中的指针相比C指针有很多限制。本篇将介绍指针相关的各种概念和Go指针相关的各种细节

指针与变量

变量是一种使用方便的占位符,用于引用计算机内存地址。可以通过&运算符获取, 指针是用来存储变量地址的变量

  1. a := "string a"
  2. fmt.Println(&a) // 0xc000044770

指针 - 图1
pointer_addr_var.png

声明初始化与赋值

1.指针声明需要指定存储地址中对应数据的类型,并使用*作为类型前缀。

  1. var ip *int /* 指向整型*/
  2. var fp *float32 /* 指向浮点型 */

指针 - 图3pointer_del.png

2.指针变量声明后会被初始化为 nil,表示空指针

  1. var a *int
  2. fmt.Println(a) // nil

3.使用 new 函数初始化:new 函数根据数据类型申请内存空间并使用零值填充,并返回申请空间地址

  1. var a *int = new(int)
  2. fmt.Println(a) // 0xc000014330
  3. fmt.Println(*a) // 0

指针 - 图5pointer_del_fill.png

4.指针赋值

  1. var a *int = new(int)
  2. *a = 10
  3. fmt.Println(a, *a)

指针 - 图7pointer_fill1.png

指针运算

  • &: 获取变量的指针
  • *: 获取指针指向的值

空指针

指针作为函数参数

多维指针

用来存储指针变量地址的变量叫做指针的指针

  1. var a ****int
  2. v := 10
  3. p1 := &v // *int
  4. p2 := &p1 // **int
  5. p3 := &p2 // ***int
  6. a = &p3 // ****int
  7. fmt.Println(v, p1, p2, p3, a)

pointer_pppp.png