为了账号安全,请及时绑定邮箱和手机立即绑定

dynamodbattribute.UnmarshalMap 将变量的类型更改为

dynamodbattribute.UnmarshalMap 将变量的类型更改为

Go
开满天机 2023-07-17 13:50:58
背景我正在尝试将返回的项目解组dynamodb.GetItem到对象中,但我在那个地方不知道哪种类型。为此,我有一个函数emptyItemConstructor返回所需类型的新对象。问题我有一个这样的函数:func GetItem(emptyItemConstructor func() interface{}) interface{} {  myItem := emptyItemConstructor()  fmt.Printf("Type is: %T\n", myItem)  _ = dynamodbattribute.UnmarshalMap(item, &myItem)  fmt.Printf("Type now is: %T\n", myItem)}我将这个函数传递给emptyItemConstructor:func constructor() MyDynamoDBItemType {    return MyDynamoDBItemType{}}该函数的输出是:Type is: MyDynamoDBItemTypeType now is: map[string]interface为什么 UnmarshalMap 改变 myItem 的类型?
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

你的功能太复杂了。不要试图将“泛型”思维强加到 Go 中。只需这样做:


func GetItem(i interface{}) {

  _ = dynamodbattribute.UnmarshalMap(item, &i)

}

但不要忽视错误:


func GetItem(i interface{}) error {

  return dynamodbattribute.UnmarshalMap(item, &i)

}

但是你根本不需要你的功能......只需使用


dynamodbattribute.UnmarshalMap(item, &i)

如预期。


查看完整回答
反对 回复 2023-07-17
?
jeck猫

TA贡献1909条经验 获得超7个赞

变量的类型myItem是,输入参数interface{}的类型也是 。赋值时不比较底层类型UnmarshalMapinterface{}


示例如下:


package main


import "fmt"


func Item() interface{} {

    return struct {

        Name string

    }{Name: "poloxue"}

}


func ItemMap(item *interface{}) {

    *item = map[string]interface{}{

        "Name": "poloxue",

    }

}


func main() {

    m := Item()

    fmt.Printf("%T\n", m)

    ItemMap(&m)

    fmt.Printf("%T\n", m)

}

如果您想将 map 解组到 struct ,请尝试使用mapstruct包?



查看完整回答
反对 回复 2023-07-17
  • 2 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信