怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面编程网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《奇异的行为:在Go中解组为结构》,涉及到,有需要的可以收藏一下
问题内容我正在开发一个工具,可以用来简化创建简单 crud 操作/端点的过程。由于我的端点不知道它们将接收哪种结构,因此我创建了一个用户可以实现的接口,并返回一个要填充的空对象。
type itemfactory interface {
generateemptyitem() interface{}
}
用户会实现类似的东西:
type test struct {
teststring string `json:"teststring"`
testint int `json:"testint"`
testbool bool `json:"testbool"`
}
func (t test) generateemptyitem() interface{} {
return test{}
}
当 test 对象被创建时,它的类型是“test”,即使 func 返回了一个 interface{}。然而,一旦我尝试将一些相同格式的 json 解组到其中,它就会剥离它的类型,并变成“map[string]interface {}”类型。
item := h.itemfactory.generateemptyitem()
//prints "test"
fmt.printf("%t\n", item)
fmt.println(reflect.typeof(item))
err := convertrequestbodyintoobject(r, &item)
if err != nil {...}
//prints "map[string]interface {}"
fmt.printf("%t\n", item)
解组项目的函数:
func ConvertRequestBodyIntoObject(request *http.Request, object interface{}) error {
body, err := ioutil.ReadAll(request.Body)
if err != nil {
return err
}
// Unmarshal body into request object
err = json.Unmarshal(body, object)
if err != nil {
return err
}
return nil
}
关于为什么会发生这种情况,或者我如何解决这个问题,有什么建议吗?
谢谢
解决方案
您的问题缺少显示此行为的示例,因此我只是猜测这就是正在发生的情况。
func generate() interface{} {
return test{}
}
func generatepointer() interface{} {
return &test{}
}
func main() {
vi := generate()
json.unmarshal([]byte(`{}`), &vi)
fmt.printf("generate type: %t\n", vi)
vp := generatepointer()
json.unmarshal([]byte(`{}`), vp)
fmt.printf("generatep type: %t\n", vp)
}
哪些输出:
Generate Type: map[string]interface {}
GenerateP Type: *main.Test
我建议您在 generateemptyitem()
中返回一个指针,而不是 generatep()
示例中演示的实际结构值。
Playground Example
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《奇异的行为:在Go中解组为结构》文章吧,也可关注编程网公众号了解相关技术文章。