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)时,拷贝值的成本比较高。