go指针

fmt.Printf使用

https://studygolang.com/articles/31801

https://www.jianshu.com/p/546edd4af6e2

 

demo code
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

 

posted @ 2022-12-19 14:27  明媚下雨天  阅读(12)  评论(0编辑  收藏  举报