go的指针类似C指针,都是一个指向其他值的值。这是一个十分重要的概率,并且它不应该被认为是危险且无法判断的。
在go中的指针有几个相比于C/C++改善的地方:
-
没有指针运算,你不能在go中这样写
var p *int p++
也就是你不能更改指针
p
指向的地址,除非你给它赋值其他地址。 -
这意味这在go中没有指针数列。
-
一旦一个值被赋予一个指针了,除了
nil
这种特殊的情况,go保证被指向的对象在指针的生命周期内都有效。因此:func f() *int { i := 1 return &i }
这段代码在go中是安全的,编译器将会安排一块内存地址给变量
i
使得在f()
返回后有效。 -
空指针,在go中你仍可以将指针指向空值以及因空指针而引起的
panic
,但与Java不同,在Java中因空指针而报错的情况在go中并不存在。我认为有以下三个原因-
多返回值,空值不在是被作为错误情况的标记。很明显,这留下了程序员不检查错误的问题,但是这只是一个习惯问题。
-
String是值类型,而不是指针,我认为,在像Java和C++中,空指针异常情况是最多的。
var s string
在上面这段代码中,
s
的默认空值是""
,而不是nil
-
事实上,大多内置的数据类型,maps,slices,channels和arrays都有一个合理的默认值,如果他们没有被初始化。
-