如何将接口的二维切片转换为结构

托尼:

我想从Google表格API获取所有行。它返回类型为的数据
[][]interface{}

我的结构是

type Record struct {
    Name string `json:"firstname"`
    Mobile    string `json:"mobile"`
}

我想将所有行都放在一个结构片中,[]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])

                    }
                }
            }
        }
    }
}

我敢肯定,这样做records[i].Mobile = r.([]interface{})[1].(string)不是正确的方法,甚至不确定我是怎么想出来的。Go要做我要达到的目标的最佳方法是什么?

如果您想运行此代码,请先通过以下步骤设置身份验证:https : //developers.google.com/sheets/api/quickstart/go,然后您可以复制/粘贴我的代码。

Tanaike :

这个修改怎么样?在这种情况下,该数值直接从投入resp.Valuesrecords

修改后的脚本:

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

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章