2016-10-23 7 views
6

無効なメモリアドレスのランタイムエラーが発生しました。予期しない無効なメモリアドレスまたはnilポインタ逆参照

panic: runtime error: invalid memory address or nil pointer dereference 
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x4e0f24] 

goroutine 1192592 [running]: 
panic(0x793540, 0xc420010040) 
#011/usr/local/go/src/runtime/panic.go:500 +0x1a1 
foobar/sd.(*Channel).Attributes(0x0, 0xc420110101, 0xc42278f9b0, 0x9) 
#011/home/app/go/src/foobar/sd/channel.go:36 +0x54 

channel.goは次のようになります。

35 func (m *Channel) Attributes() (*ChannelAttrs, error) { 
36 redisHash := "sd:channels:" + m.hash 
37 
38 rc := m.ctx.RedisPool.Get() 
39 values, err := redis.Values(rc.Do("HGETALL", redisHash)) 
40 rc.Close() 
41 if err != nil { 
42  return nil, err 
43 } 
44 attrs := ChannelAttrs{} 
45 redis.ScanStruct(values, &attrs) 
46 return &attrs, nil 
47 } 

どのようにそれはライン36がこれを引き起こしている可能性がありますか?どういうわけかmがnilになる可能性はありますか?もしそうなら、どうですか?

注:ハッシュこれはAttributesnilとして受信mで呼び出されていることを意味する文字列

+0

はこれを呼び出すコードで 'M' 'nil'ですか? – abligh

+0

私は分かりませんが、これは生産コードではめったに起こりません。私はそれを複製する方法を見つけていない。 mが外出していてもそれは可能ですか? –

+0

あなたはお見逃しでしたm [更新](https://play.golang.org/p/j9T0dQ8-oH) – patilnitin

答えて

11

として定義されます。 mがされているように、この特定の方法Attributes()nil受信機と呼ばれるように設計されていない - 原則方法において

nil受信機と呼ばれることができる(それらはnilをチェックする場合、これはあっても有用であるかもしれない) - here参照しますチェックを行わずに参照解除されました。これは(nilレシーバmで呼び出されたメソッド)は、あなたの呼び出しコードで起こっているものです。

on the playground hereの簡略化された例を参照してください。+ m.hashをコメントアウトすると、すべてが正常に動作します(here)。以下

コード:ある

package main 

import (
    "fmt" 
) 

type Channel struct { 
    hash string 
} 

func (m *Channel) Attributes() { 
    r := "x" + m.hash 
    fmt.Println(r) 
} 

func main() { 
    var c *Channel 
    c.Attributes() 
} 

出力は:

panic: runtime error: invalid memory address or nil pointer dereference 
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x20131] 

goroutine 1 [running]: 
panic(0x102360, 0x1040a038) 
    /usr/local/go/src/runtime/panic.go:500 +0x720 
main.(*Channel).Attributes(0x0, 0x104000f0) 
/tmp/sandbox285779060/main.go:12 +0x131 
main.main() 
    /tmp/sandbox285779060/main.go:18 +0x20 
+0

ああ私は、エラーが属性関数の行であると私が混乱していることがわかります。 nilオブジェクト上の関数を呼び出すことは今まで使えるのですか? –

+1

問題は「m.hash」内のnilポインタを参照解除することです。あなたが '+ m.hash'をコメントアウトすると、うまくいくでしょう - https://play.golang.org/p/KSQ0cMxkmb - を見てください。そうでない場合は、' nil'オブジェクトを使って関数を呼び出すことは大丈夫ですポインタの逆参照)。 – abligh

+0

ありがとう、これはすべてを明確にする:) –

関連する問題