[英]How do I return data from a 'for' loop in Go?
我正在嘗試將[]*Struct
轉換為 JSON 響應。 我能夠從[]*Struct
中獲取數據並對其進行迭代。 我陷入困境的部分是迭代循環,然后將數據返回到interface{}
。
我試圖把一個接口放在一個接口中,但我就是入不敷出。 這是我目前所擁有的; 如果我有任何問題,我被告知要求助於 Stack Overflow。
package main
import (
"log"
"context"
"cloud.google.com/go/datastore"
)
var ctx = context.Background()
type ItemList struct {
Id string `datastore:"_id"`
Name string `datastore:"name"`
}
type Data struct {
ManyItems []Item
}
type Item struct {
Id string `json:"id"`
Name string `json:"name"`
}
func Get() ([]*ItemList, error) {
client, err := datastore.NewClient(ctx, "project-name")
if err != nil {
log.Println(err)
}
var Response []*ItemList
query := datastore.NewQuery("query")
_, err = client.GetAll(ctx, query, &Response)
if err != nil {
log.Println(err)
}
return Response, error
}
func Read() (interface{}) {
resp, err := Get()
if err != nil {
log.Println(err)
}
for i, _ := range resp {
// this is where i get stuck
r := &Data{
ManyItems: Item{
Id: resp[i].Id,
Name: resp[i].Name,
},
}
return r
}
}
我該怎么做?
您可以預先聲明一個*Data
變量,然后在循環內,在每次迭代時將項目添加到它的ManyItems
字段。 由於ItemList
和Item
具有相同的結構,即相同的字段順序相同,您可以直接將其轉換為另一個。 (只要您使用 Go 1.8 或更高版本)
func Read() interface{} {
resp, err := Get()
if err != nil {
log.Println(err)
return nil
}
data := &Data{ManyItems: make([]Item, len(resp))}
for i := range resp {
data.ManyItems[i] = Item(*resp[i])
}
return data
}
但是,如果可能的話,只返回你已經擁有的切片會更有效,就像這樣。
type ItemList struct {
Id string `datastore:"_id" json:"id"`
Name string `datastore:"name" json:"name"`
}
type Data struct {
ManyItems []*ItemList
}
func Read() interface{} {
resp, err := Get()
if err != nil {
log.Println(err)
return nil
}
return &Data{ManyItems: resp}
}
您在 for 循環內返回,這只會返回第一項。
我還看到 ManyItems 是一個 Item ([]Item) 數組,而您分配的單個 Item 是錯誤的。
更新:這里有完整的代碼:
// Input Json data
type ItemList struct {
Id string `datastore:"_id"`
Name string `datastore:"name"`
}
//Convert *ItemList to *Item
func (list *ItemList) ToItem() *Item {
return &Item {
Id : list.Id,
Name : list.Name,
}
}
// Output Json data
type Data struct {
ManyItems []*Item `json:"data"`
}
//Output json item object
type Item struct {
Id string `json:"id"`
Name string `json:"name"`
}
// The read function
func Read() (string, error) {
resp, err := Get()
if err != nil {
log.Println(err)
return "", err
}
list := make([]Item, len(resp))
for i, _ := range resp {
list[i] = resp[i].ToItem()
}
b, err := json.Marshal(&Data{list})
if err != nil {
fmt.Println(err)
return "", err
}
return string(b), nil
}
測試:游樂場
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.