Skip to content

Instantly share code, notes, and snippets.

@chenjiyong
Created August 14, 2014 01:45

Revisions

  1. chenjiyong created this gist Aug 14, 2014.
    84 changes: 84 additions & 0 deletions gistfile1.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,84 @@
    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的值就变了