Gob Decode给出“无法分配值的DecodeValue”错误

时间:2017-10-10 16:32:16

标签: go serialization encode gob

我是Go-goh的新手,我在把电线放到电线上时遇到了一些麻烦。我写了一个我认为会通过的快速测试,但是解码调用返回了“无法分配值的DecodeValue”错误。这是代码:

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 个答案:

答案 0 :(得分:2)

如果有朋友看看这个,他指出gob不会让你指定一个零指针。来自gob包docs:“不允许使用Nil指针,因为它们没有价值。”它看起来像gob反映传入的结构的字段,并尝试从编码流中分配值。改变这个:

var t2 *tester

对此:

t2 := &tester{}

使测试通过。