我是靠谱客的博主 耍酷向日葵,这篇文章主要介绍Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference,现在分享给大家,希望可以做个参考。

指针基础知识

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
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
地址0xc042068018 (&p)0xc04204a080 (p)
0xc04204a080 (p)1 (*p)

错误实例

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

复制代码
1
2
3
4
5
6
7
8
9
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赋值肯定会出错
解决这个问题非常简单,在给指针赋值前可以先创建一块内存分配给赋值对象即可

复制代码
1
2
3
4
5
6
7
8
9
10
package main import "fmt" func main() { var i *int i = new(int) *i = 1 fmt.Println(i, &i, *i) }

转自:https://blog.csdn.net/qq_36431213/article/details/82967982

最后

以上就是耍酷向日葵最近收集整理的关于Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference的全部内容,更多相关Go内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部