go指针理解

337 阅读1分钟

指针

v0.1

1、go默认都是值传递,包括函数,方法,不进行指针转换,比如b = a 如果有指针出现,&,*这些,那么一定要进行响应的转换;比如: A :=&a,那么A一定是指针,如果要得到a的值,需要: b :=*A或者 b = a

2、因为函数是值传递,所以在某个函数A中定义变量,把这变量x传到另外一个函数B中,函数B对x进行更新操作(x值传递了给了B),那么对A中的x无影响,本来php也是这样的; 考虑一下demo:

type Person struct {
    Name string
    Age  int
}

// 定义 Person 的一个方法 hello
func (p Person) hello() {
    fmt.Printf("Hello, my name is %s. I'm %d years old\n", p.Name, p.Age)
}

func (p Person) grow() {
    p.Age += 1
}

好了,接下来写一个测试程序:

func main() {
    allen := Person{"allen", 19}
    allen.hello() // Output: Hello, my name is allen. I'm 19 years old
    allen.grow()
    allen.hello() // Output: Hello, my name is allen. I'm 19 years old
}

为什么还是19?因为在其他函数main中实例化的Person->allen,那么如果在其他函数中改变allen值,则必须传引用;以下两步:

  • 传引用
(&allen).grow() //标准写法
allen.grow()  // 快捷方法,直接使用 allen 对象调用指针接收器的方法,Go 会自动的将其转换成 (&allen).grow(),而不需要你显式的这样去写。
  • 将接收体改成*,*代表传引用
func (p *Person) grow() {
    p.Age += 1
}

最终:

func main() {
    allen := Person{"allen", 19}
    allen.hello() // Output: Hello, my name is allen. I'm 19 years old
    allen.grow()
    allen.hello() // Output: Hello, my name is allen. I'm 20 years old
}
扩展
以下代表代表返回指针类型,无论return,go都会自动判断
func default() *Engine {
      engine := New()
      engine.Use(Logger(), Recovery())
      return engine
}

参考:blog.csdn.net/q1007729991…