如何在结构体中使用带有私有变量的Go-amino库

时间:2018-07-19 07:39:34

标签: go private

当结构中有私有变量时,我想使用氨基元帅。

在test2程序包中,test.go:

type Lnt struct {
    Neg bool
    abs string // this variable
}

func NewLnt() Lnt {
    return Lnt{
        Neg: true,
        abs: "abcdefef",
    }
}

测试go文件:

func TestAbc(t *testing.T) {
    s := test2.NewLnt()
    t.Log("s=", s)

    cdc := amino.NewCodec()

    b, err := cdc.MarshalBinary(s)
    assert.Nil(t, err)
    t.Log("b=",b)

    var s2 test2.Lnt
    err = cdc.UnmarshalBinary(b, &s2)
    assert.Nil(t, err)
    assert.Equal(t, s, s2)

    t.Log("s2=", s2)
}

结果:

encoding_test.go:39: s= {true abcdefef}
encoding_test.go:55: 
        Error Trace:    encoding_test.go:55
        Error:          Not equal: 
                        expected: test2.Lnt{Neg:true, abs:"abcdefef"} 
                        actual  : test2.Lnt{Neg:true, abs:""} // error

                        Diff:
                        --- Expected
                        +++ Actual
                        @@ -2,3 +2,3 @@
                          Neg: (bool) true,
                        - abs: (string) (len=8) "abcdefef"
                        + abs: (string) ""
                         }
        Test:           TestAbc
encoding_test.go:57: s2= {true }

私有变量“ abs”丢失。.

它是否不受支持,或者在这种情况下还有其他使用方式?

1 个答案:

答案 0 :(得分:2)

最简单的答案是你不能。

这里发生的是,您正在将所有导出的值编组为二进制格式,但是未包括未导出的值,因为封送处理程序无法访问它们。

二进制数据被解组到一个新的结构中,并且由于未导出的字段不在二进制数据中,因此该结构不可能用该值初始化。 (此外,由于未导出,因此无法设置值)。

如果您希望此测试通过,则需要导出struct字段(公开),或者接受数据在编组过程中丢失。