Strongswan govici无法序列化Child SA的mark_in/mark_out字段问题
问题原因
Go语言中仅首字母大写的导出字段能被外部包通过反射访问。你的childSA结构体里markIn和markOut字段首字母小写,属于私有字段,govici的MarshalMessage方法无法读取这些字段,因此序列化时会被忽略。
解决方案
将childSA中的字段改为首字母大写的导出字段,同时保留vici标签映射到协议中的mark_in和mark_out字段:
修改后的代码:
package main import ( "fmt" "github.com/k0kubun/pp/v3" "github.com/strongswan/govici/vici" ) func main() { type childSA struct { MarkIn string `vici:"mark_in"` // 改为首字母大写的导出字段 MarkOut string `vici:"mark_out"` // 改为首字母大写的导出字段 } type viciConnection struct { LocalAddrs []string `vici:"local_addrs"` RemoteAddrs []string `vici:"remote_addrs"` Children map[string]*childSA `vici:"children"` } vc := viciConnection{ LocalAddrs: []string{"1.1.1.1"}, RemoteAddrs: []string{"2.2.2.2"}, Children: map[string]*childSA{ "onlyChild": &childSA{ MarkIn: "4/0xffffffff", // 对应修改后的字段名 MarkOut: "4", // 对应修改后的字段名 }, }, } c, err := vici.MarshalMessage(vc) if err != nil { fmt.Printf("%v\n", err) return } pp.Default.SetColoringEnabled(false) fmt.Printf("Marshalled message: %s\n", pp.Sprint(c)) }
修改后的输出
Marshalled message: &vici.Message{ keys: []string{ "local_addrs", "remote_addrs", "children", }, data: map[string]interface {}{ "children": &vici.Message{ keys: []string{ "onlyChild", }, data: map[string]interface {}{ "onlyChild": &vici.Message{ keys: []string{ "mark_in", "mark_out", }, data: map[string]interface {}{ "mark_in": "4/0xffffffff", "mark_out": "4", }, }, }, }, "local_addrs": []string{ "1.1.1.1", }, "remote_addrs": []string{ "2.2.2.2", }, }, }
可以看到mark_in和mark_out字段已正确出现在onlyChild节点的data中,符合预期。
内容的提问来源于stack exchange,提问作者Jeff Learman
相关产品推荐
相关产品推荐

