首页 > 解决方案 > 如何在结构中使用带有私有变量的 go-amino 库

问题描述

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

在 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”丢失..

是否不支持,或者在这种情况下是否有其他方法可以使用它?

标签: goprivate

解决方案


简短的回答是你不能。

这里发生的事情是将所有导出的值编组为二进制格式,但未导出的值不包括在内,因为编组器无权访问它们。

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

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


推荐阅读