在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")
}

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