Go dynamodbattribute.UnmarshalMap将my变量的类型存储到映射[string]接口{}

Go dynamodbattribute.UnmarshalMap将my变量的类型存储到映射[string]接口{},go,types,Go,Types,背景 我正在尝试将dynamodb.GetItem返回的项解组到一个对象中,我当时不知道该对象的类型。 为此,我有一个函数emptyItemConstructor,它返回所需类型的新对象t 问题: 我有这样一个函数: func GetItem(emptyItemConstructor func() interface{}) interface{} { myItem := emptyItemConstructor() fmt.Printf("Type is: %T\n", myItem)

背景

我正在尝试将dynamodb.GetItem返回的项解组到一个对象中,我当时不知道该对象的类型。 为此,我有一个函数emptyItemConstructor,它返回所需类型的新对象t

问题:

我有这样一个函数:

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:

该函数的输出为:

Type is: MyDynamoDBItemType
Type now is: map[string]interface
为什么解组映射要更改myItem的类型?

变量myItem的类型是接口{},而解组映射输入参数的类型也是接口{}。赋值时不比较基础类型

例如:

包干管 进口fmt func项接口{}{ 返回结构{ 名称字符串 }{姓名:波罗雪} } func ItemMapitem*接口{}{ *item=map[string]接口{}{ 姓名:波洛雪, } } func main{ m:=项目 fmt.Printf%T\n,m ItemMap&m fmt.Printf%T\n,m }
如果要解组映射到结构,请尝试打包?

您的函数太复杂了。不要试图强迫泛型思维进入围棋。只要这样做:

func GetItem(i interface{}) {
  _ = dynamodbattribute.UnmarshalMap(item, &i)
}
但不要忽略错误:

func GetItem(i interface{}) error {
  return dynamodbattribute.UnmarshalMap(item, &i)
}
但是你根本不需要你的功能。。。只用

dynamodbattribute.UnmarshalMap(item, &i)

正如预期的那样。

您正在传递一个指向接口的指针以解组映射。不要那样做。更改构造函数以返回*MyDynamoDBItemType。MyDynamoDBItemType的定义是什么?
dynamodbattribute.UnmarshalMap(item, &i)