panic: runtime error: invalid memory address or nil pointer dereference
package main
import "fmt"
func main() {
var i *int
fmt.Println(i, &i)
*i = 10 // panic: runtime error: invalid memory address or nil pointer dereference
fmt.Println(i, &i)
}
指针
指针是存储另一个变量内存地址的变量。所以指针也是一种变量,只不过它是一种特殊的变量,它的值存放的是另一个变量的内存地址。
在上面的例子中,指针 p 的值是 0x0001,这个值是变量 a 的内存地址,而 *p 表示变量 a 的在内存中的值。
var i *int
结合上面代码,当声明一个指针变量时,指针在内存中的值是 nil,表示这个指针是没有指向一个特定的变量。
所以我们通过 i = 10 赋值时,这种方式会报错,因为 i 表示指针实际指向的值,空指针是没有指向的。
所以我们可以得出结论: 当指针变量没有指向时,也就是为 nil 时,不能对 *point 就行赋值操作,否则会报空指针异常。
解决
那如何解决呢,把 i 赋值为一个变量的地址,通过 new(int) 就能处理,具体参考 new 函数 的使用方式。
package main
import "fmt"
func main() {
var i *int
i = new(int)
*i = 1
fmt.Println(i, &i)
}