在A tour of go的第27页Struct Literals时,注意到了代码中的
* &
之前,只学习过Java、JavaScript 对于,指针了解较少。
在Search一下之后,找到了一些资料,没翻doc,不过还是和大家分享一下自己的理解。
& and
& means of “address of” &表示变量的内存地址
func zero(x int) {
x = 0
}
func main() {
x := 5
zero(x)
fmt.Println(x) // x is still 5
}
在zero函数中的操作,无法改变main函数中的x值。 因为,zero中x只是main中x的value。 输出5。
如果想要改变main函数中的x值,可这样:
func zero(xPtr *int) {
*xPtr = 0
}
func main() {
x := 5
zero(&x)
fmt.Println(x) // x is 0
}
指针指向x的内存地址,而非其数值。
* asterisk
- 星号可以表示两种含义:
pointer to “指向”,zero中,xPtr是一个指向int的指针。
dereference 取消引用、解引用: 使我们能访问指针指向的值。 *xPtr = 0 是说“将0存储在xPtr引用的内存值中。
如果改为
xPtr = 0
将会出现compiler error—
xPtr is not an int it's a *int
&x会返回一个*int,因为x是int。 而&x和xPtr关联在同一内存位置中。
new keywork
new关键字:
func one(xPtr *int) {
*xPtr = 1
}
func main() {
xPtr := new(int)
one(xPtr)
fmt.Println(*xPtr) // x is 1
}
new将会返回一个指针。
如果去掉最后输出行的*, 改为xPtr。 输出结果将不是1
而是储存1的内存地址。
0xc200000018
总结:
指针在go中,很少用,但是与**构造器**配合使用,则会很方便。
依我个人的理解,&用来返回一个*type,一个内存地址(比如xPtr)
想变更、访问这个内存地址的value,需要在其前边加* (如*xPtr)
当然,对指针了解不是很深,如有错误,敬请指正。
参考
PS:思考
- 如何获取变量的内存地址?
- 如何把一个值附给一个指针?
- 如何创造一个指针?
- 下面代码的x返回值?
func square(x float64) { x = x * x } func main() { x := 1.5 square(&x) }
- 写一个交换两个值的程序swap(&x,&y)。
The Original Link: http://baham.github.io/11_17_goyu-yan-de-zhi-zhen.html
If you want to reprint it, please do under the CC BY-NC-SA 4.0