douyong1908 2019-06-18 16:03
浏览 917
已采纳

在Golang中访问for循环之外的变量

I'm trying to read a CSV file to store the values in a variable. However, I couldn't access the variables outside of the for loop

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
", record[0]) // works fine too
    }
    fmt.Printf("%v
", record) // returns empty slice
}

func main() {
    GetKeys("credentials.csv")
}
  • 写回答

1条回答 默认 最新

  • ds355020 2019-06-18 16:09
    关注

    Your loop breaks when reader.Read() returns io.EOF. This happens when your input is consumed.

    At the same time (when io.EOF is returned), the returned record will be nil. Reader.Read():

    If there is no data left to be read, Read returns nil, io.EOF.

    So you assign nil to the record variable, the loop breaks, and you inspect the record variable.

    If your intent is to hold the last record, store it in a separate variable, and do not "overwrite" it with the last nil record:

    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
    ", record[0]) // works fine too
    }
    fmt.Printf("%v
    ", lastRecord) // this will be the last non-nil record
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?