因为我经常 unmarshal http.Response.Body
,所以我想我可以编写一个函数来处理读取、关闭和解组到各种不同结构中的所有麻烦。这就是为什么我引入了一个函数func unmarhalInterface(closer *io.ReadCloser, v *interface{}) error
,然后可以使用 断言返回值t:=i.(T)
。
我已经将它包装成类型的值*interface{}
,但是因为覆盖类型是interface{}
而不是myStruct
,json
所以包实现选择了map[string]interface{}
。之后类型断言就会失败(当然)。我是否缺少任何内容或需要此实现“手动”进行类型断言,这意味着查找映射中的所有字段并将我想要的字段分配到我的结构中。
下面的代码有最少的示例,注释中带有注释。如果我的解释不够充分,请离开。
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
)
type myStruct struct {
A string `json:"a"`
B string `json:"b"`
}
func main() {
jsonBlob := []byte(`{"a":"test","b":"test2"}`)
var foo = interface{}(myStruct{})
closer := ioutil.NopCloser(bytes.NewReader(jsonBlob))
err := unmarshalCloser(&closer, &foo)
if err != nil {
log.Fatal(err)
}
fmt.Println(fmt.Sprintf("%v", foo))
// That´s what i want:
foo2 := foo.(myStruct)
fmt.Println(foo2.A)
}
func unmarshalCloser(closer *io.ReadCloser, v *interface{}) error {
defer func() { _ = (*closer).Close() }()
data, err := ioutil.ReadAll(*closer)
if err != nil {
return err
}
err = json.Unmarshal(data, v)
if err != nil {
return err
}
return nil
}
蛊毒传说
相关分类