go語言指針
- 為什么需要指針
- 指針使用實例
- 值傳遞
- 地址傳遞
- 多級指針
為什么需要指針
作為一個大學劃水,畢業一直寫java的程序員來說,多多少少對于指針有點陌生,由于近期需要轉go,正好學到指針這里,就來探究下指針的使用場景和用法吧。
首先我們來看下以下這個簡單的例子,主方法通過形參將a傳遞進方法changeValue,然后這個方法將值改變了,那么主方法得到的值是否會改變呢?
import "fmt"/**
指針專題
*/func changeValue(p int) {p = 10
}func main() {var a = 1changeValue(a)fmt.Println("a = ", a)
}
運行后我們發現打印的a的值為1,a并沒有因為changeValue這個方法而改變。
究其原因是因為我們調用方法的時候是通過值傳遞的,而非地址傳遞,它的模型如下:
因為兩個值存在于不同的地址中,所以值沒有改變,為了使上述方法能讓值得到修改,我們需要通過指針傳入地址來讓修改的變量值在當前地址中進行修改。
package mainimport "fmt"/**
指針專題
*/func changeValue(p *int) {*p = 10
}func main() {var a = 1changeValue(&a)fmt.Println("a = ", a)
}
因此使用指針過后,修改的為地址的值
指針使用實例
值傳遞
func swap(a int, b int) {var temp inttemp = aa = bb = temp
}func main() {var a = 10var b = 20swap(a, b)fmt.Println("a=", a, "b=", b)
}
最終a=10 b=20,值并沒有改變
地址傳遞
func swap(pa *int, pb *int) {var temp inttemp = *pa*pa = *pb*pb = temp
}func main() {var a = 10var b = 20swap(&a, &b)fmt.Println("a=", a, "b=", b)
}
最終a=20 b=10,通過地址傳遞改變了原來的值
多級指針
指向指針的指針稱為多級指針
func main() {a := 0//一級指針var p *intp = &afmt.Println(&a)fmt.Println(p)//二級指針var pp **intpp = &pfmt.Println(&p)fmt.Println(pp)
}
打印結果如下
0x1400000e078
0x1400000e078
0x14000046020
0x14000046020