go语言中的指针跟C/C++没有什么区别,存放变量的内存地址。go指针的的空指针是nil,定义一个指针变量,它的默认值是 nil。
指针声明:
var var_name *var_type
例:
var Val1 *int
跟C/C++用法一样,通过操作符 "&" 取变量地址, "*" 通过指针访问目标对象。
package main
import (
"fmt"
)
func main() {
var val1 int = 101
var ptr *int = &val1
fmt.Println("变量地址:", &val1, ptr, *ptr)
var p *int
fmt.Println(p)
}
在C++中提到指针一般都会想到new/delete。
go也有new关键字,new(T) 创建一个T类型的匿名变量,所做的是为T类型的新值分配并清零一块内存空间,然后将这块内存空间的地址作为结果返回,而这个结果就是指向这个新的T类型值的指针值,返回的指针类型为*T。
new创建的内存空间位于heap上,空间的默认值为数据类型默认值。如:new(int) 则 *p为0,new(bool) 则 *p为false。
我们只需使用new()函数,无需担心其内存的生命周期或怎样将其删除,因为Go语言的内存管理系统会帮我们打理一切,这个解决了C/C++程序员的一个痛点,易发的内存泄漏。
package main
import (
"fmt"
)
func main() {
var p *int
fmt.Println(p)
p = new(int)
fmt.Println(*p) //0
}