野指针是一种指向内存位置是不可知的指针,一般是由于指针变量在声明时没有初始化所导致的。在 Go
语言中,布尔类型的零值为 false
,数值类型的零值为 0,字符串类型的零值为 ""
,而指针、切片、映射、信道、函数和接口的零值则是 nil
。
nil
是 Go
语言中一个预定义的标识符,Go
中的 nil
和其它语言中的 null
有很多不同点:
nil
标识符是不能比较的nil
没有默认的类型不同类型的指针是一样的 0x0
野指针示例:
package main
import (
"fmt"
)
func main() {
var p *int // 指针声明未初始化,野指针
fmt.Printf("%p\n", ptr) // 0x0
// *p = 10 panic 无效的内存地址或 nil 指针解引用 Pointer Dereference,野指针不能进行 *p 取值
fmt.Println(ptr) // nil
var a int = 10
p = &a // 可以重新指向变量 a 的地址
*p = 2 // 即可修改变量a 内存地址的值
fmt.Println(a) // 2
}
悬空指针是指它最初指向的内存空间已经被释放掉了,在 Go
语言中,如果函数内变量的地址作为函数返回值,编译器就会判断出该变量在函数调用完成后还需要被引用,因此不在栈中为其分配存储空间,而是在堆中为其分配存储空间,这样的变量在函数调用完成后其占用的存储空间不会被立刻释放,也就避免出现悬空指针这种情况。
type Command struct {
Name string // 指令名称
Var *int // 指令绑定的变量
Comment string // 指令的注释
}
func newCommand(name string, varref *int, comment string) *Command {
return &Command{
Name: name,
Var: varref,
Comment: comment,
}
}
cmd = newCommand(
"version",
&version,
"show version",
)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)