Как конвертировать 2d фрагмент интерфейса в структуру - PullRequest
1 голос
/ 14 апреля 2019

Я хочу получить все строки из API листов Google. Возвращает данные с типом
[][]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, и вы можете скопировать / вставить мой код.

1 Ответ

0 голосов
/ 14 апреля 2019

Как насчет этой модификации?В этом случае значения непосредственно помещаются от resp.Values до records.

Модифицированный скрипт:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...