go - 如何在结构中使用带有私有变量的 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”丢失..
是否不支持,或者在这种情况下是否有其他方法可以使用它?
解决方案
简短的回答是你不能。
这里发生的事情是将所有导出的值编组为二进制格式,但未导出的值不包括在内,因为编组器无权访问它们。
二进制数据被解组为一个新的结构,并且由于未导出的字段不在二进制数据中,因此该结构不可能使用该值进行初始化。(此外,它不能设置值,因为它未导出)。
如果您希望此测试通过,您将需要导出结构字段(公开),或者接受数据在编组时丢失。
推荐阅读
- php - 将 if/else 转换为三元运算符
- android - 在recyclerview中过滤产品列表 - android
- express - 如何在 express 中重构中间件路由?
- flutter - 在颤动中用图像替换所有元素
- sql - 如何在 SQL 中使用 union 排序以首先选择查询值?
- javascript - 获取已定义对象javascript的不可枚举对象键
- python - I am tryna make an virtual assistant and facing some errors about GoogleAPI
- css-selectors - How can I build Tic Tac Toe game without using JavaScript?
- python - tkinter:NameError:未定义名称“Tk”
- android - 如何在 Fragment Android 中使用导航组件