go指针类型
go 指针类型存放的是某个变量的内存地址。在 go 语言里,通过*T声明指向类型为T的指针。指针类型的零值为nil。
package main
import "fmt"
func main() {
var p *int32 //定义一个指向 int32的指针
var a int32 = 10 //定义一个 int32类型的变量
p = &a //将变量的地址赋给p
fmt.Printf("修改之前, *p : %d, a: %d", *p, a)
*p = 100 //修改p地址对应的值
fmt.Printf("\n修改之后, *p : %d, a: %d", *p, a)
}
*在声明变量时,表示变量是一个指针类型;当作为操作符作用于指针变量时,表示取指针指向地址的值。*p=100表示将指针p指向地址的值赋为100,p指向变量a,可以看到变量a的值也变成了100.
go 内建方法new 能够分配内存,并且返回一个指针。该方法的签名如下:
func new(Type) *Type
The new built-in function allocates memory. The first argument is a type, not a value, and the value returned is a pointer to a newly allocated zero value of that type.
当变量作为参数传入到 func 时,涉及到按值传递还是按指针传递。例如:
package main
import "fmt"
func passByValue(a int32) {
a = a + 10
}
func passByPointer(a *int32) {
(*a) = (*a) + 10
}
func changePointer(a *int32) {
var b int32 = 100
a = &b
}
func main() {
var a int32 = 10
fmt.Printf("\n初始值:%d", a)
passByValue(a)
fmt.Printf("\n调用passByValue后:%d", a)
passByPointer(&a)
fmt.Printf("\n调用passByPointer后:%d", a)
changePointer(&a)
fmt.Printf("\n调用changePointer后:%d", a)
}
passByValue方法里面的变量a和main方法里面的a是两个变量,修改passByValue方法里面的a不会影响main方法里面的a;
passByPointer里面的变量a是指向main方法里a的指针,所以可以修改main方法里面a的值;
changePointer方法里,将b的地址重新赋给a,所以不影响main方法里面的a。
按值传递的优点是,方法对值的修改不会影响调用方,缺点是当变量是复杂类型(如 struct)时,拷贝值的成本比较高。