短的
以下代码并不完全符合预期:https : //play.golang.org/p/sO4w4I_Lle
我假设我像往常一样弄乱了一些指针/引用的东西,但是我希望我的......
func unmarshalJSON(in []byte, s interface{}) error
……还有encoding/json……
func Unmarshal(data []byte, v interface{}) error
...以相同的方式运行(例如,更新作为第二个参数传递的引用)。
长
上面的例子是一个没有多大意义的最小复制器。这是为了让它在操场上工作。然而,一个不那么有意义的例子是这样的:
package main
import (
"fmt"
"gopkg.in/yaml.v2"
)
func unmarshalYAML(in []byte, s interface{}) error {
var result map[interface{}]interface{}
err := yaml.Unmarshal(in, &result)
s = cleanUpInterfaceMap(result)
// s is printed as expected
fmt.Println(s) // map[aoeu:[test aoeu] oaeu:[map[mahl:aoec tase:aoeu]]]
return err
}
func cleanUpInterfaceArray(in []interface{}) []interface{} {
out := make([]interface{}, len(in))
for i, v := range in {
out[i] = cleanUpMapValue(v)
}
return out
}
func cleanUpInterfaceMap(in map[interface{}]interface{}) map[string]interface{} {
out := make(map[string]interface{})
for k, v := range in {
out[fmt.Sprintf("%v", k)] = cleanUpMapValue(v)
}
return out
}
func cleanUpMapValue(v interface{}) interface{} {
switch v := v.(type) {
case []interface{}:
return cleanUpInterfaceArray(v)
case map[interface{}]interface{}:
return cleanUpInterfaceMap(v)
case string:
return v
default:
return fmt.Sprintf("%v", v)
}
}
func main() {
s := make(map[string]interface{})
b := []byte(`---
aoeu:
- test
- aoeu
oaeu:
- { tase: aoeu, mahl: aoec}
`)
err := unmarshalYAML(b, &s)
if err != nil {
panic(err)
}
// s is still an empty map
fmt.Println(s) // map[]
}
这个想法是将 YAML 解组为map[string]interface{}(而不是map[interface{}]interface{})以便允许序列化为 JSON(其中标识符需要是字符串)。该unmarshalYAML功能应该提供同样的FUNC signture为yaml.Unmarshal...
万千封印
炎炎设计
随时随地看视频慕课网APP
相关分类