Go语言 dynamodbattribute.UnmarshalMap将变量的类型更改为map[string]接口{}

azpvetkf  于 2023-03-10  发布在  Go
关注(0)|答案(2)|浏览(76)

背景

我正在尝试将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: MyDynamoDBItemType
Type now is: map[string]interface

为什么UnmarshalMap要更改myItem的类型?

58wvjzkj

58wvjzkj1#

你的函数太复杂了,不要再把“泛型”的思维强加给Go语言了,你可以这样做:

func GetItem(i interface{}) {
  _ = dynamodbattribute.UnmarshalMap(item, &i)
}

但不要忽视错误:

func GetItem(i interface{}) error {
  return dynamodbattribute.UnmarshalMap(item, &i)
}

但是这样就不需要函数了...只需使用

dynamodbattribute.UnmarshalMap(item, &i)

如预期的那样。

zpgglvta

zpgglvta2#

变量myItem的类型为interface{}UnmarshalMap输入参数的类型也为interface{},赋值时没有底层类型的比较
下面是一个例子:

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解组为结构,请尝试mapstructure包?

相关问题