Go 如何将接口的二维切片转换为结构
我想从GoogleSheetsAPI获取所有行。它返回带有Go 如何将接口的二维切片转换为结构,go,Go,我想从GoogleSheetsAPI获取所有行。它返回带有 []接口{} 我的结构是 type Record struct { Name string `json:"firstname"` Mobile string `json:"mobile"` } 我想将所有行放在struct[]Record的一个切片中,其中每个字段都是excel工作表中的一个单元格 请参阅下面的代码以了解我的尝试: package main import ( "encoding/json
[]接口{}
我的结构是
type Record struct {
Name string `json:"firstname"`
Mobile string `json:"mobile"`
}
我想将所有行放在struct[]Record
的一个切片中,其中每个字段都是excel工作表中的一个单元格
请参阅下面的代码以了解我的尝试:
package main
import (
"encoding/json"
"fmt"
"log"
)
func main() {
srv err := InitialiseSheets()
fmt.Println("")
if err != nil {
log.Fatalf("Unable to retrieve data from sheet: %v", err)
}
spreadsheetId := "1VoMAKHSnB6nptPnQqabMlKWraxWolYgPBxRo-thwmgk"
readRange := "A:B"
resp, err := srv.Spreadsheets.Values.Get(spreadsheetId, readRange).Do()
if err != nil {
log.Fatalf("Unable to retrieve data from sheet: %v", err)
}
var records []Record = make([]Record, len(resp.Values))
byt, err := resp.MarshalJSON()
var dat map[string]interface{}
if err = json.Unmarshal(byt, &dat); err != nil {
panic(err)
}
for key, value := range dat {
switch key {
case "values":
switch vv := value.(type) {
case []interface{}:
for i, u := range vv {
switch r := u.(type) {
case interface{}:
records[i].Name = r.([]interface{})[0].(string)
records[i].Mobile = r.([]interface{})[1].(string)
// [Daniel Webster 425255565]
fmt.Println("kk.([]interface{})", r.([]interface{}))
// [Daniel Webster]
fmt.Println("kk.([]interface{})[0]", r.([]interface{})[0])
}
}
}
}
}
}
我肯定做一些像记录[I].Mobile=r.([]接口{})[1]。(字符串)
这样的事情不是一个正确的方法,我甚至不知道我是怎么想到的。做我想做的事情的最好方式是什么
如果您想运行此代码,请先通过以下方式设置身份验证:您可以复制/粘贴我的代码。此修改如何?在这种情况下,值直接从
对应值
放入记录
修改脚本:
这次修改怎么样?在这种情况下,值直接从
对应值
放入记录
修改脚本:
返回的数据是什么样子的?
resp.MarshalJSON()
@Ibu返回的任何内容都将返回一个字节片。具体来说,您可以执行类似于fmt.Printf(“%s”,string(byt))
的操作来查看实际内容,这样您就可以正确使用返回的数据,而不是使用界面。为了正确了解您的情况,您可以提供一个示例电子表格吗?@Tanaike谢谢!很好,很高兴接受你的回答!返回的数据是什么样子的?resp.MarshalJSON()
@Ibu返回的任何内容都将返回一个字节片。具体来说,您可以执行类似于fmt.Printf(“%s”,string(byt))
的操作来查看实际内容,这样您就可以正确使用返回的数据,而不是使用界面。为了正确了解您的情况,您可以提供一个示例电子表格吗?@Tanaike谢谢!很好,很高兴接受你的回答!
func main() {
srv err := InitialiseSheets()
fmt.Println("")
if err != nil {
log.Fatalf("Unable to retrieve data from sheet: %v", err)
}
spreadsheetId := "1VoMAKHSnB6nptPnQqabMlKWraxWolYgPBxRo-thwmgk"
readRange := "A:B"
resp, err := srv.Spreadsheets.Values.Get(spreadsheetId, readRange).Do()
if err != nil {
log.Fatalf("Unable to retrieve data from sheet: %v", err)
}
var records []Record = make([]Record, len(resp.Values))
// Below script was modified.
for i, row := range resp.Values {
records[i].Name = row[0].(string)
records[i].Mobile = row[1].(string)
}
// do something
}