go - 如果数据库为空则返回一个空数组

标签 go

我的应用程序的前端期望在命名空间下从服务器返回 json(如下面的 messages)

{
   messages: [{
       "id": "6b2360d0" //other properties omitted

   },{
       "id": "a01dfaa0" //other properties omitted

   }]
}

如果没有消息,我需要返回一个带有命名空间的空数组

{

    messages: []
}

但是,如果没有从数据库中提取消息,下面的代码当前返回 null

{

        messages: null
    }

我怎样才能改变下面的代码,这样

  {

        messages: []
    }

如果数据库中没有消息则返回?

type Inbox struct {
    Messages []*Message `json:"messages"`
}
type Message struct {
    Content string `json:"type"`
    Date string `json:"date"`
    Id   string `json:"id"`
}

func fetchMessages(w http.ResponseWriter, req *http.Request) {

    var ib Inbox

    var index int = 0

    err := db.View(func(tx *bolt.Tx) error {

        c := tx.Bucket([]byte("messages")).Cursor()

        for k, v := c.Last(); k != nil && index < 10; k, v = c.Prev() {

         //note the next few lines might appear odd, currently each  json object to be added to the array of messages is also namespaced under 'message', so I first unmarshal it to a map and then unmarshal again into a the struct
            var objmap map[string]*json.RawMessage
            if err := json.Unmarshal(v, &objmap); err != nil {
                return err
            }

            message := &Message{}
            if err := json.Unmarshal(*objmap["message"], &message); err != nil {
                return err
            }

            ib.Messages = append(ib.Messages, message)

        }

        return nil
    })

    response, _ := json.Marshal(a)
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    w.Write(response)

}

最佳答案

替换:

    var ib Inbox

与:

    var ib Inbox
    ib.Messages = make([]*Message, 0)

或与:

    ib := Inbox{Messages: make([]*Message, 0)}

(可选地使用 make(…, 0, someInitialCapacity) 代替。)

关于go - 如果数据库为空则返回一个空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30549522/

相关文章:

azure - 使用 Azure AD B2C 时无法访问图形 API

html - 为什么在我输入电子邮件时没有显示我的订单状态?

go - 需要将 2 维数组转换为字符串并将最后一个逗号替换为句号。(Golang)

go - 如何在 golang 中将 uint64 转换为 big.Int?

node.js - 使用socket.io连接node js服务器和golang服务器有什么缺点?

go - 检查 SSL 自签名证书的有效性

go - Golang MySQL驱动程序不允许使用ProxySQL进行数据库更改

pointers - 复制原始对象后仍在修改

go - 在同一行写入值

shell - 在 Golang 中需要交互式输入的测试执行程序