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

标签 csv for-loop go scope func

我正在尝试读取 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")
}

最佳答案

reader.Read() 返回 io.EOF 时,您的循环中断。当您的输入被消耗时,就会发生这种情况。

同时(返回io.EOF时),返回的记录将为nilReader.Read() :

If there is no data left to be read, Read returns 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

关于csv - 在 Golang 中访问 for 循环之外的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56653062/

相关文章:

c# - 根据替换可能性生成列表字符串

python - typeerror '_csv.reader' 对象不可订阅

python - 返回数据框底部具有最大/最小值的行(python/pandas)

php - 仅当 csv 行数更改时刷新页面

go - 在 GO 中获取实际文件大小与表观大小

templates - 如果标签名称中包含 ".",我如何获取 Docker 镜像的标签?

Java 8 将自定义元素添加到集合中的方法?

java - 如何只打印数组中的偶数或奇数字符?

cat/Xargs/command VS for/bash/command

azure - Golang/CosmosDB 分页