2016-10-23 17 views
6

Geçersiz bir bellek adresi için çalışma zamanı hatası alıyorum.Beklenmedik geçersiz bellek adresi veya geçersiz işaretçi referansı

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 şuna benzer:

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 } 

Nasıl hat 36 bu neden olması mümkündür? m için nil olmak mümkün mü? Öyleyse nasıl?

Not: karma Bu Attributesnil olarak alıcı m ile çağrılan demektir dize

+0

bu çağrıları kodunda ' 'm'' nil' mı? – abligh

+0

Bilmiyorum, bu nadiren üretim kodunda olur. Kopyalamak için bir yol bulamadım. Gitmek için m bile mümkün mü? –

+0

Öznitelikleri kaçırdınız m [Güncelleme] (https://play.golang.org/p/j9T0dQ8-oH) – patilnitin

cevap

11

olarak tanımlanır. m olmak olduğu gibi, ama bu özel yöntem Attributes() bir nil alıcı ile çağrılacak tasarlanmamıştır - prensip yöntemlerde

nil alıcıları ile çağrılabilir (ve nil kontrol, bu da yararlı olabilir) - here bakınız nil kontrolünden yoksun bırakılır. Bu (nil alıcı m ile çağrılan yöntem) çağrı kodunuzda olan şeydir.

basitleştirilmiş örnek on the playground here bakın ve here olarak, + m.hash dışında yorum her şeyi iyi çalışır hale unutmayın. Aşağıda

Kodu: is

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

çıkışı olan:

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

Oh Gördüğünüz gibi, bu hata, öznitelikler işlev satırı için olduğunu karıştırıyor. Bir nil nesnesinde bir işlevi çağırmak hiç kullanılabilir mi? –

+1

Sorun, * dereferencing * 'm.hash' öğesindeki nil işaretçisi. '+ M.hash' diye yorum yaparsanız iyi olur - bkz. Https://play.golang.org/p/KSQ0cMxkmb - (eğer evet, eğer yapmazsanız bir 'nil 'nesnesine sahip bir işlevi çağırmak tamam dereferans işareti). – abligh

+0

Çok teşekkürler, bu her şeyi daha net hale getiriyor :) –

İlgili konular