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

背景


我正在尝试将返回的项目解组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 的类型?


开满天机
浏览 101回答 2
2回答

炎炎设计

你的功能太复杂了。不要试图将“泛型”思维强加到 Go 中。只需这样做:func GetItem(i interface{}) {  _ = dynamodbattribute.UnmarshalMap(item, &i)}但不要忽视错误:func GetItem(i interface{}) error {  return dynamodbattribute.UnmarshalMap(item, &i)}但是你根本不需要你的功能......只需使用dynamodbattribute.UnmarshalMap(item, &i)如预期。

jeck猫

变量的类型myItem是,输入参数interface{}的类型也是 。赋值时不比较底层类型UnmarshalMapinterface{}示例如下:package mainimport "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包?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go