2015-11-09 6 views
0

Все!Golang и т. Д. Panic

Я код ниже:

package main 

import (
     "log" 

     "github.com/coreos/go-etcd/etcd" 
) 

func main() { 
     client := etcd.NewClient(
       []string{ 
         "http://172.20.20.10:2379", 
         "http://172.20.20.11:2379", 
         "http://172.20.20.12:2379", 
       }, 
     ) 
     for { 
       watchChan := make(chan *etcd.Response) 
       go client.Watch("/config", 0, false, watchChan, nil) 

       log.Println("Waiting for an update...") 
       r := <-watchChan 

       log.Printf(">>> got an updated config: %s: %s\n", r.Node.Key, r.Node.Value) 
     } 
} 

НО ... Когда некоторый узел (например, 172.20.20.11) снижается паника жалуются по поводу неправильного адреса памяти или нулевой указатель разыменования .. .

> $ ./etcd-watcher 
2015/11/09 18:46:19 Waiting for an update... 
panic: runtime error: invalid memory address or nil pointer dereference 
[signal 0xb code=0x1 addr=0x10 pc=0x22fe] 

goroutine 1 [running]: 
main.main() 
    /Users/Stalker/Workspace/src/snippets/etcd-watcher.go:26 +0x2be 

goroutine 17 [syscall, locked to thread]: 
runtime.goexit() 
    /Users/Stalker/App/Go/1.5.1/src/runtime/asm_amd64.s:1696 +0x1 

goroutine 19 [runnable]: 
net/http.(*persistConn).writeLoop(0xc8200c6dc0) 
    /Users/Stalker/App/Go/1.5.1/src/net/http/transport.go:1009 +0x40c 
created by net/http.(*Transport).dialConn 
    /Users/Stalker/App/Go/1.5.1/src/net/http/transport.go:686 +0xc9d 

Может ли кто-нибудь объяснить мне, что происходит, и как сделать этот простой пример подходящим? Большое спасибо за советы! Alex

ответ

4

Библиотека может закрыть канал watchChan. Это вернет значение nil в вашем r, а затем будет паниковать при попытке регистрации r.Node. Когда вы вернете указатель назад, вы должны проверить, что это не nil. Я также рекомендую проверить, был ли канал приемника закрыт и действовать соответствующим образом.

r, open := <-watchChan 
if !open { 
    // channel is closed 
} 
if r == nil { 
    // the watch channel return a nil value 
} 
+0

Большое спасибо! Работает!!! –