当结构中有私有变量时,我想使用氨基元帅。
在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”丢失。.
它是否不受支持,或者在这种情况下还有其他使用方式?
答案 0 :(得分:2)
最简单的答案是你不能。
这里发生的是,您正在将所有导出的值编组为二进制格式,但是未包括未导出的值,因为封送处理程序无法访问它们。
二进制数据被解组到一个新的结构中,并且由于未导出的字段不在二进制数据中,因此该结构不可能用该值初始化。 (此外,由于未导出,因此无法设置值)。
如果您希望此测试通过,则需要导出struct字段(公开),或者接受数据在编组过程中丢失。