指針指針
Go 擁有指針。指針保存了值的內存地址。code
類型*T
是指向T
類型值的指針。其零值爲nil
。內存
var p *intimport
&
操做符會生成一個指向其操做數的指針。引用
i := 42
p = &iim
*
操做符表示指針指向的底層值。重定向
fmt.Println(*p) // 經過指針 p 讀取 i
*p = 21 // 經過指針 p 設置 icopy
這也就是一般所說的「間接引用」或「重定向」。co
與 C 不一樣,Go 沒有指針運算生成
案例:
package main import "fmt" func main() { i, j := 42, 2701 p := &i // 指向 i fmt.Println(*p) // 經過指針讀取 i 的值 *p = 21 // 經過指針設置 i 的值 fmt.Println(i) // 查看 i 的值 p = &j // 指向 j *p = *p / 37 // 經過指針對 j 進行除法運算 fmt.Println(j) // 查看 j 的值 }
package main import "fmt" func swap(a *int, b *int) { tmp := *a // 「間接引用」或「重定向」 注意go沒有指針運算 *a = *b *b = tmp return } func main() { first := 100 second := 200 swap(&first, &second) fmt.Println(first) // 200 fmt.Println(second) // 100 }
package main import "fmt" func swap(a *int, b *int) (int, int) { tmp := a a = b b = tmp return *a, *b } func main() { first := 100 second := 200 a, b := swap(&first, &second) // 交換a,b值,地址copy fmt.Println(a, b) fmt.Println(first) // 100 fmt.Println(second) // 200 }