在Go

时间:2018-06-05 10:32:19

标签: go

我正在连接数据库,获取一行,然后将其发送回用户。如果我找不到那行或者我有错误,我想要做的是return语句。

因为我正在返回一个结构,所以我不能返回nil而且我得到了错误cannot use nil as type Item in return argument(Item是我的结构)

我在线阅读如果我在return语句中使用指针并返回* Item而不是Item,那么我将能够传递nil,当我尝试创建item := *Item{}时,我收到以下错误{{ 1}}

我认为有一些解决方案,但我找不到任何,我真正想知道的是:

  • 如何返回指针* Item而不是Item
  • 还有另一种方法可以为结构返回nil吗?

这是我的代码:

invalid indirect of Item literal (type Item)

1 个答案:

答案 0 :(得分:5)

您正在为item变量分配错误。你说你试过item := *Item{},而创建指针的方法是通过使用new内置函数,或者创建一个文字,以及地址操作符(&) 。后者是你在golang中最常见的方法。在某些情况下,人们会使用new,但在这种情况下,我会采用第二种方法:

所以:

item := &Item{}
// or
item := new(Item)

最后,您可以保持代码不变,只需在结尾处返回一个指针:

item := Item{}
// some code here
return &item, nil

如果您必须返回错误,您仍然可以return nil, err

所以把所有东西放在一起:

// return *Item instead of Item
func Handler(request Request) (*Item, error) {
   // your code here, eg:
   item := Item{}
   if err := dynamodbattribute.UnmarshalMap(result.Item, &item); err != nil {
        return nil, err
    }
    return &item, nil
}

或者,将item指定为从开头

的指针
func Handler(request Request) (*Item, error) {
   // your code here, eg:
   item := &Item{}
   if err := dynamodbattribute.UnmarshalMap(result.Item, item); err != nil {
        return nil, err
    }
    return item, nil
}