以下是读取CSV文件的代码片段:

func parseLocation(file string) (map[string]Point, error) {
    f, err := os.Open(file)
    defer f.Close()
    if err != nil {
        return nil, err
    }
    lines, err := csv.NewReader(f).ReadAll()
    if err != nil {
        return nil, err
    }
    locations := make(map[string]Point)
    for _, line := range lines {
        name := line[0]
        lat, laterr := strconv.ParseFloat(line[1], 64)
        if laterr != nil {
            return nil, laterr
        }
        lon, lonerr := strconv.ParseFloat(line[2], 64)
        if lonerr != nil {
            return nil, lonerr
        }
        locations[name] = Point{lat, lon}
    }
    return locations, nil
}

有没有办法提高这段代码的可读性?if和nil噪声.

推荐答案

Go现在有了一个csv软件包.它是encoding/csv.你可以在这里找到文件:https://golang.org/pkg/encoding/csv/

文档中有几个很好的例子.下面是我创建的一个助手方法,用于读取csv文件并返回其记录.

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "os"
)

func readCsvFile(filePath string) [][]string {
    f, err := os.Open(filePath)
    if err != nil {
        log.Fatal("Unable to read input file " + filePath, err)
    }
    defer f.Close()

    csvReader := csv.NewReader(f)
    records, err := csvReader.ReadAll()
    if err != nil {
        log.Fatal("Unable to parse file as CSV for " + filePath, err)
    }

    return records
}

func main() {
    records := readCsvFile("../tasks.csv")
    fmt.Println(records)
}

Go相关问答推荐

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

理解Golang并发:缓冲通道的意外行为

+在具有html/模板Golang的Base64中

错误.如果它包含切片,则返回FALSE

GoFR HTTP服务初始化中Open遥测传输和超时配置的说明

创建服务时云运行触发器执行失败

当我有外键时,如何使用 GORM 创建数据库的新条目

Cypher 查找(多个)最低 node

无法在go中为docker容器写入有效的挂载路径

Golang和Gin web框架在router.Run()之后执行代码

使用 httptest 对 http 请求进行单元测试重试

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

Go 中的 Azure JWT 验证不起作用

如何使用泛型将接口转换为指定类型

当函数返回一个函数时,为什么 Go 泛型会失败?

GoReleaser 和 ssh-agent Github 操作:为什么无法读取用户名...终端提示已禁用?

将未知长度切片的值分配给Go中的 struct ?

如何在golang中使用ozzo验证进行时间最大验证

是否存在一个Go泛型类型约束,该约束捕获了将类型用作映射中的键的能力?

Gorilla/Mux 和 Websocket 竞赛条件,这安全吗?