为了账号安全,请及时绑定邮箱和手机立即绑定

附加到另一个结构内的结构切片时无效的内存地址恐慌

附加到另一个结构内的结构切片时无效的内存地址恐慌

Go
慕的地10843 2021-07-26 16:20:27
我不明白为什么在附加到另一个结构内的结构切片时会出现无效的内存地址恐慌。运行代码时出现以下错误。panic: runtime error: invalid memory address or nil pointer dereference[signal 0xb code=0x1 addr=0x0 pc=0x400d5f]goroutine 3 [running]:main.Pairs.CollectTickers(0x0, 0x0)        test.go:32 +0x15fcreated by main.main        test.go:42 +0x42goroutine 1 [sleep]:time.Sleep(0x174876e800)        /usr/lib/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2fmain.main()        test.go:43 +0x57exit status 2此代码产生以下错误:package mainimport (        "fmt"        "sync"        "time")var PairNames = []string{ "kalle", "kustaa", "daavid", "pekka" }type Data struct {        a int        b int}type Tickers struct {    Tickers []Data}type Pairs struct {        Pair map[string]*Tickers        Mutex sync.Mutex}func (pairs Pairs) CollectTickers() {        PairCount := len(PairNames)        for x := 0; x <= 1000; x++ {                for i := 0; i < PairCount-1; i++ {                        var data Data                        data.a = i * x                        data.b = i + x                        pairs.Mutex.Lock()                        pairs.Pair[PairNames[i]].Tickers = append(pairs.Pair[PairNames[i]].Tickers, data)                        pairs.Mutex.Unlock()                        fmt.Printf("a = %v, b = %v\r\n", data.a, data.b)                }        }}func main() {        var pairs Pairs        go pairs.CollectTickers()        time.Sleep(100 * time.Second)}
查看完整描述

2 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

的值pairs.Pair[PairNames[i]]是nil因为PairNames[i]在pairs.Pair映射中没有条目并且nil是 的零值*Tickers。因此,pairs.Pair[PairNames[i]].Tickers取消引用nil指针的尝试是无效的。

对于地图类型 M 的 a:


if the map is nil or does not contain such an entry, a[x] is the zero value

for the value type of M

该语言现在指定,出于安全原因,保证 nil 指针的某些使用会触发运行时恐慌。


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信