Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference

指针基础知识
package main

import "fmt"

func main() {
	var p *int
	p = new(int)
	*p = 1
	fmt.Println(p, &p, *p)
}

输出
0xc04204a080  0xc042068018  1

  • Go* 代表取指针地址中存的值,& 代表取一个值的地址
  • 对于指针,我们一定要明白指针储存的是一个值的地址,但本身这个指针也需要地址来储存
    • 如上 p 是一个指针,他的值为内存地址 0xc04204a080
    • p 的内存地址为 0xc042068018
    • 内存地址 0xc04204a080 储存的值为 1
地址0xc0420680180xc04204a080
0xc04204a0801

错误实例
  • golang 中如果我们定义一个指针并像普通变量那样给他赋值,例如下方的代码
package main

import "fmt"
func main() {
	var i *int
	*i = 1
    fmt.Println(i, &i, *i)
}
  • 就会报这样的一个错误
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x1 addr=0x0 pc=0x498025]
  • 报这个错的原因是 go 初始化指针的时候会为指针 i 的值赋为 nil ,但 i 的值代表的是 *i 的地址, nil 的话系统还并没有给 *i 分配地址,所以这时给 *i 赋值肯定会出错
  • 解决这个问题非常简单,在给指针赋值前可以先创建一块内存分配给赋值对象即可
package main

import "fmt"
func main() {
	var i *int
	i = new(int)
	*i = 1
	fmt.Println(i, &i, *i)
}

  • 17
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值