go语言指针
对于新手来说,在使用指针的时候,经常把&
与*
弄混。现在来简单的总结一下,他们的用法。
&是取地址符,放到一个变量前使用就会返回相应变量的内存地址
例如:
package main
import "fmt"
func main() {
var a int = 10
fmt.Printf("变量的地址: %x\n", &a ) //变量的地址: c000060080
}
*是内容符,放到一个变量前使用就会返回相应变量的内存地址
package main
import "fmt"
func main() {
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */
fmt.Printf("a 变量的地址是: %x\n", &a )
/* 指针变量的存储地址 */
fmt.Printf("ip 变量储存的指针地址: %x\n", ip )
/* 使用指针访问值 */
fmt.Printf("*ip 变量的值: %d\n", *ip )
}
可以看到*
除了可以用于取出指针中的内容外,还可以放在变量类型的前面用于指针的申请。
一个复杂的案例:
package main
import "fmt"
func main() {
var a int = 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */
fmt.Printf("ip 变量储存的值: %v\n", *ip)
setWithPoint(ip) //传指针,改变指针所对外部的值
fmt.Printf("ip 变量储存的值: %v\n", *ip)
fmt.Println("===================")
fmt.Printf("ip 变量储存的值: %v\n", *ip)
setWithValue(*ip) //传值,不改变外部的值
fmt.Printf("ip 变量储存的值: %v\n", *ip)
}
func setWithPoint(n *int) {
*n = 11111
}
func setWithValue(n int) {
n = 111111
}