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

浙公网安备 33010602011771号