Baham's Blog

Above all else, guard your heart.

Go语言的指针

在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) 

当然,对指针了解不是很深,如有错误,敬请指正。

参考

golang-book

Spirefire blog

PS:思考

  1. 如何获取变量的内存地址?
  2. 如何把一个值附给一个指针?
  3. 如何创造一个指针?
  4. 下面代码的x返回值?
    
     func square(x float64) {
         x = x * x
     }
     func main() {
         x := 1.5
     square(&x)
     }
    
  5. 写一个交换两个值的程序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

Comments