# Go 语言指针详解

# 理解指针

作为一个 JavaScript 程序员,理解 Go 语言的指针是学习 Go 时的一个较大障碍,所以在这里详细解释下 Go 的指针概念以及实践场景。

假设我们要交换 a, b 的值,先看下面的例子:

let [a, b] = [0, 1];

function swap(a, b) {
  let c;
  c = a;
  a = b;
  b = c;
}
swap(a, b);

console.log(a, b); // 0, 1

我们可以看出,swap 函数执行,并没有将 a,b 值进行交换,其原因是 swap 函数中参数 a,b是将外部的 a,b 变量拷贝一份,其内部交换并没有改变外部变量的值。 修改正确代码如下:

let [a, b] = [0, 1];

function swap(a, b) {
  return [b, a]
}

[a, b] = swap(a, b);

在 JavaScript 中,其实是没有指针的概念的,如果要交换两个变量的值,外部变量需要去接收 swap 函数返回的值,并重新赋值。

在 go 语言中,指针其实就是一个索引变量,代表变量的地址, 地址存放变量真实的内容。

a, b := 0, 1

function swap(a, b *int) {
  *a, *b = *b , *a
}

swap(&a, &b);

这样,我们传进来的参数 a,b 代表外部 a,b变量的指针,执行函数传入 a,b 的地址,这样我们在函数内交换的是a, b地址,就会将外部变量真实的内容进行交换。

提示

指针和地址是成对出现的。

# 什么时候我们要用指针呢?

当我们在函数内部,想要去修改外部传进来参数的原始值,就需要参数为指针类型。