-
-
Save yangvipguang/7a670a727833ca5172af7d409d5fe1f6 to your computer and use it in GitHub Desktop.
golang 中指针的使用及理解
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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