指针这个东西,不管是在哪个语言里,都算是比较难懂的概念,其实只要解释清楚,指针的概念并不难理解。

golang中打印地址的方法是:fmt.Printf("%p", x),x表示要打印的数据结构

package main

import "fmt"

func main() {
    ss := []string{"a", "b", "c"}
    //小张=你
    fmt.Printf("数据地址=%p,指针地址=%p\n", ss, &ss)

    ss1 := ss
    //张三=你
    fmt.Printf("数据地址=%p,指针地址=%p\n", ss1, &ss1)
    
    ss = []string{"d"}
    //小张=另外一个同事
    fmt.Printf("数据地址=%p,指针地址=%p\n", ss, &ss)
}

上述代码的打印结果:
数据地址=0xc04203bd70,指针地址=0xc04203e3c0
数据地址=0xc04203bd70,指针地址=0xc04203e440
数据地址=0xc0420381e0,指针地址=0xc04203e3c0

我们可以看到数据地址是一样的,但是变量本身的地址是不一样的。这个怎么理解呢?从生活的角度来解释可能比较容易:你在你的部门叫张三,也有人叫你小张,或者叫你小三,假定你是部门里唯一叫这些名字的,那张三,小张,小三都代表了你这个人。你这个人,就是我们上面说的数据地址,张三,小张,小三,都是指针变量,它们都指向你这个人。

指针指向是有可能变化的,例如部门里新来了一个姓张年龄比你小的同事张四,那么在你们部门中小张这个名字,指向就变成张四。

这里的假设有几个前提:

  • 限定在部门中,也就是一台主机。
  • 一个名字,只能指向一个人。也就是指针需要指向具体的一个数据