我注意到,当我使用由公共和私有成员组成的结构时,那么私有成员不会被Cadence活动复制(?)。
例如,我有一个结构体:package foo
type Foo struct {
Name string
PublicList []string
privateList []string
}
func NewFoo() *Foo {
return &Foo{
Name: "Test",
PublicList: []string{"A", "B", "C"},
privateList: []string{"one", "two"},
}
}
func (f *Foo) ShowLists() {
fmt.Println("PublicList: ", f.PublicList, ", privateList: ", f.privateList)
}
我还使用了其他结构体,注册为活动结构体:
package activities
type FooActivities struct{}
func (a *FooActivities) NewFoo(ctx context.Context) (*foo.Foo, error) {
return foo.NewFoo(), nil
}
func (a *FooActivities) ShowLists(ctx context.Context, f *foo.Foo) error {
f.ShowLists()
return nil
}
我的工作流以以下方式调用这两个活动:
var f *foo.Foo
workflow.ExecuteActivity(ctx, fooActivities.NewFoo).Get(ctx, &f)
workflow.ExecuteActivity(ctx, fooActivities.ShowLists, f).Get(ctx, nil)
ShowLists
函数打印的结果:
PublicList: [A B C], privateList: []
为什么私有列表没有按预期初始化?这是bug还是特性?我在Cadence文档中找不到这个问题的答案。
Cadence(和Temporal)默认使用json.Marshal
序列化活动参数,json.Unmarshall
反序列化活动参数。它不序列化私有字段。
这是一个可能的解决方案。
我认为这是由于反射不能复制未导出的字段