Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save yangvipguang/7a670a727833ca5172af7d409d5fe1f6 to your computer and use it in GitHub Desktop.
Save yangvipguang/7a670a727833ca5172af7d409d5fe1f6 to your computer and use it in GitHub Desktop.
golang 中指针的使用及理解
go指针是什么?
定义
所谓指针其实你可以把它想像成一个箭头,这个箭头指向(存储)一个变量的地址。
因为这个箭头本身也需要变量来存储,所以也叫做指针变量。
通过下面的例子可以看出指针地之间的关系。
package main
2
3 import (
4 "fmt"
5 )
6
7 type A struct {
8 name string
9 }
10
11 func main() {
12 a_pointer := new(A)
13 fmt.Println("指向A对象的指针", "a_pointer=", a_pointer)
14 fmt.Println("指向A对象的指针的地址", "&a_pointer=", &a_pointer)
15 b := &a_pointer
16 fmt.Println("指向指针a_pointer的指针b", "b=", b)
17 fmt.Println("指向指针a_pointer的指针b的地址", "&b=", &b)
18 }
输出后的结果:
指向A对象的指针 a_pointer= &{}
指向A对象的指针的地址 &a_pointer= 0xc20802e018
指向指针a_pointer的指针b b= 0xc20802e018
指向指针a_pointer的指针b的地址 &b= 0xc20802e028
通过这个例子我们可以看出来,所谓指针就是一个指向(存储)特定变量地址的变量。
用途:
指针的一大用途就是可以将变量的指针作为实参传递给函数,从而在函数内部能够直接修改实参所指向的变量值。
Go的变量传递都是值传递。
我们看看下面这个例子:
package main
import (
"fmt"
)
func nochange(x int) {
x = 200
}
func main() {
var x int = 100
fmt.Println(x)
nochange(x)
fmt.Println(x)
}
输出的结果是:
100100
通过上面的例子我们可以看出nochange函数改变的仅仅是内部变量x的值,而不会改变传递进去的实参。
我们再看看下面这个例子:
package main
import (
"fmt"
)
func change(x *int) {
*x = 200
}
func main() {
var x int = 100
fmt.Println(x)
change(&x)
fmt.Println(x)
}
输出的结果是:
100200
上面的例子中,change函数的虚参为整型指针变量,
所以在main中调用的时候传递的是x的地址。
然后在change里面使用*x=200修改了这个x的地址的值。所以x的值就变了。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment