2017-10-10 744 views
0

我是新手,我在将电线放在电线上时遇到了一些麻烦。我写了一个我认为会通过的快速测试,但解码调用返回了“DecodeValue of unassignable value”错误。这里的代码:Gob解码给出“DecodeValue of unassignable value”错误

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

我怀疑我在这里失去了一些愚蠢的东西,并感谢您能够提供任何帮助。

回答

1

有一位朋友看看这个,他指出gob不会让你指定一个零指针。从gob包docs:“无指针是不允许的,因为它们没有价值。”它看起来像gob反映了传入的结构的字段,并试图从编码流中分配值。更改此:

var t2 *tester 

要这样:

t2 := &tester{} 

使测试通过。