Доступ к переменным вне цикла for в Golang - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь прочитать файл CSV, чтобы сохранить значения в переменной.Однако я не смог получить доступ к переменным вне цикла for

func GetKeys(filename string) {
    var record []string
    var err error
    file, err := os.Open(filename)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()
    // Create a new reader.
    reader := csv.NewReader(bufio.NewReader(file))
    for {
        record, err = reader.Read()
        // Stop at EOF.
        if err == io.EOF {
            break
        }
        fmt.Printf("%v", record) // works fine
        fmt.Printf("%v\n", record[0]) // works fine too
    }
    fmt.Printf("%v\n", record) // returns empty slice
}

func main() {
    GetKeys("credentials.csv")
}

1 Ответ

0 голосов
/ 18 июня 2019

Ваш цикл прерывается, когда reader.Read() возвращает io.EOF. Это происходит, когда ваш ввод потребляется.

В то же время (когда возвращается io.EOF), возвращаемая запись будет nil. Reader.Read():

Если нет данных для чтения, Read возвращает nil, io.EOF .

Таким образом, вы присваиваете nil переменной record, цикл прерывается, и вы проверяете переменную record.

Если вы хотите сохранить последнюю запись, сохраните ее в отдельной переменной и не перезаписывайте ее последней nil записью:

var lastRecord []string
for {
    record, err = reader.Read()
    // Stop at EOF.
    if err == io.EOF {
        break
    }
    lastRecord = record
    fmt.Printf("%v", record) // works fine
    fmt.Printf("%v\n", record[0]) // works fine too
}
fmt.Printf("%v\n", lastRecord) // this will be the last non-nil record
...