2017-10-10 6 views
0

Je suis nouveau pour Go et j'ai du mal à mettre un coup sur le fil. J'ai écrit un test rapide que je pensais passer, mais l'appel de décodage renvoie une erreur "DecodeValue de valeur non assignable". Voici le code:Décodage de Gob Donner "DecodeValue de valeur non assignable" Erreur

type tester struct { 
    Payload string 
} 

func newTester(payload string) *tester { 
    return &tester { 
     Payload: payload, 
    } 
} 

func TestEncodeDecodeMessage(t *testing.T) { 
    uri := "localhost:9090" 
    s := "the lunatics are in my head" 
    t1 := newTester(s) 
    go func(){ 
     ln, err := net.Listen("tcp", uri) 
     assert.NoError(t, err) 
     conn, err := ln.Accept() 
     assert.NoError(t, err) 

     var t2 *tester 
     decoder := gob.NewDecoder(conn) 
     err = decoder.Decode(t2) 
     assert.NoError(t, err) 
     conn.Close() 
     assert.NotNil(t, t2) 
    }() 

    time.Sleep(time.Millisecond * 100) 
    conn, err := net.Dial("tcp", uri) 
    assert.NoError(t, err) 

    gob.Register(t1) 
    encoder := gob.NewEncoder(conn) 
    err = encoder.Encode(t1) 
    assert.NoError(t, err) 
    conn.Close() 
    time.Sleep(time.Millisecond * 100) 
} 

Je pense que je manque ici quelque chose de stupide et d'apprécier toute l'aide que vous êtes en mesure d'offrir.

Répondre

1

Un ami a jeté un coup d'oeil à cela et il a fait remarquer que le gob ne vous laisse pas assigner à un pointeur nul. A partir du package gob docs: "Les pointeurs Nil ne sont pas autorisés car ils n'ont aucune valeur." Il semble que gob réfléchisse sur les champs de la structure transmise et tente d'assigner des valeurs à partir du flux codé. La modification de cette:

var t2 *tester 

à ceci:

t2 := &tester{} 

fait passer de test.