【问题标题】:Gob Decode Giving "DecodeValue of unassignable value" ErrorGob 解码给出“无法赋值的解码值”错误
【发布时间】:2017-10-11 00:56:45
【问题描述】:

我是 Go 的新手,但在将 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)
}

我怀疑我在这里遗漏了一些愚蠢的东西,感谢您提供的任何帮助。

【问题讨论】:

    标签: go serialization encode gob


    【解决方案1】:

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

    var t2 *tester
    

    到这里:

    t2 := &tester{}
    

    使测试通过。

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 2016-01-09
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多