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)
}