go指针
https://studygolang.com/articles/31801
https://www.jianshu.com/p/546edd4af6e2
package main import "fmt" type Person struct { name string age int } // 值接收者方法 func (p Person) older() { p.age++ } // 指针接收者方法 func (p *Person) olderWithPtr() { p.age++ } func (p Person) say() { fmt.Printf("I'm %s, %d years old.\n", p.name, p.age) } func modifyParam(arr [3]int, num int) { arr[0] = 100 num = 100 } func modifyParamWithPtr(arr *[3]int, num *int) { // (*arr)[0] = 100 arr[0] = 100 *num = 100 } func main() { fmt.Printf("%.3f\n", 123.1239567) // 四舍五入 // 定义 num := 10 // int numP := &num // numA的内存地址 fmt.Printf("num的内存地址: %p\n", numP) pNumP := &numP // 指针pointerA的内存地址 fmt.Printf("指针numP的内存地址: %p\n", pNumP) var ptrNil *int // 零值 fmt.Printf("零值 ptrNil: %v,十六进制表示 -> %p\n", ptrNil, ptrNil) // 指针不能参与运算 //numP++ // Invalid operation: numP++ (non-numeric type *int) // 解引用 fmt.Printf("numP 解引用 %d\n", *numP) personP := &Person{"AA", 16} // 访问结构体字段可以不用(*personP)显示解引用 fmt.Printf("Person name: %s, age: %d\n", (*personP).name, personP.age) // 方法接收者 p1 := Person{"A1", 20} p1.say() p1.older() p1.say() p2 := Person{"B1", 30} p2.say() p2.olderWithPtr() // 修改方法接收者内部的数据 p2.say() // 修改参数 numArray := [3]int{1, 2, 3} otherNum := 20 fmt.Printf("origin Array: %#v, Number: %d\n", numArray, otherNum) modifyParam(numArray, otherNum) fmt.Printf("after -> Array: %#v, Number: %d\n", numArray, otherNum) modifyParamWithPtr(&numArray, &otherNum) fmt.Printf("after -> Array: %#v, Number: %d\n", numArray, otherNum) // new函数 newNumPtr1 := new(Person) newNumPtr2 := new(Person) fmt.Printf("每次调用都返回新地址, %p, %p", newNumPtr1, newNumPtr2) }
123.124 num的内存地址: 0x14000122010 指针numP的内存地址: 0x1400011c020 零值 ptrNil: <nil>,十六进制表示 -> 0x0 numP 解引用 10 Person name: AA, age: 16 I'm A1, 20 years old. I'm A1, 20 years old. I'm B1, 30 years old. I'm B1, 31 years old. origin Array: [3]int{1, 2, 3}, Number: 20 after -> Array: [3]int{1, 2, 3}, Number: 20 after -> Array: [3]int{100, 2, 3}, Number: 100 每次调用都返回新地址, 0x14000114018, 0x14000114030