【问题标题】:Is it bad practice to add helpers for IO operations in Go?在 Go 中为 IO 操作添加助手是不好的做法吗?
【发布时间】:2021-12-02 08:57:23
【问题描述】:

我来自 C# 背景,并使用来自 System.IO 命名空间的 File.ReadAllLinesFile.WriteAllLines 等 IO 方法。得知 Go 没有这些 IO 操作的便利函数时,我有点惊讶。为了避免代码重复,我编写了以下帮助程序。有什么理由不这样做吗?

// WriteBytes writes the passed in bytes to the specified file. Before writing,
// if the file already exists, deletes all of its content; otherwise, creates
// the file.
func WriteBytes(filepath string, bytes []byte) (err error) {
    file, err := os.Create(filepath)
    if err != nil {
        return err
    }
    defer closeWithErrorPropagation(file, &err)

    _, err = file.Write(bytes)
    if err != nil {
        return err
    }

    return err
}

// WriteString writes the passed in sting to the specified file. Before writing,
// if the file already exists, deletes all of its content; otherwise, creates
// the file.
func WriteString(filepath string, text string) (err error) {
    file, err := os.Create(filepath)
    if err != nil {
        return err
    }
    defer closeWithErrorPropagation(file, &err)

    _, err = file.WriteString(text)
    if err != nil {
        return err
    }

    return err
}

// WriteLines writes the passed in lines to the specified file. Before writing,
// if the file already exists, deletes all of its content; otherwise, creates
// the file.
func WriteLines(filepath string, lines []string) (err error) {
    file, err := os.Create(filepath)
    if err != nil {
        return err
    }
    defer closeWithErrorPropagation(file, &err)

    for _, line := range lines {
        _, err := file.WriteString(fmt.Sprintln(line))
        if err != nil {
            return err
        }
    }

    return err
}

func closeWithErrorPropagation(c io.Closer, err *error) {
    if closerErr := c.Close(); closerErr != nil && *err == nil { // Only propagate the closer error if there isn't already an earlier error.
        *err = closerErr
    }
}

【问题讨论】:

    标签: go io helper


    【解决方案1】:

    os.WriteFile 可以处理 WriteBytesWriteString 函数的等效功能:

    // func WriteBytes(filepath string, bytes []byte) (err error)
    
    err = os.WriteFile("testdata/hello", []byte("Hello, Gophers!"), 0666)
    
    
    // func WriteString(filepath string, text string) (err error)
    
    text := "Hello, Gophers!"
    err = os.WriteFile("testdata/hello", []byte(text), 0666)
    

    并结合strings.Join可以处理WriteLines

    //func WriteLines(filepath string, lines []string) (err error)
    
    lines := []string{"hello", "gophers!"}
    err = os.WriteFile("testdata/hello", []byte(strings.Join(lines, "\n")), 0666)
    

    【讨论】:

    • 另外,假设lines是一个字符串切片,func WriteLines可以替换为os.WriteFile(outputFile, []byte(strings.Join(lines, "\n")), 0666)
    • 正要添加那个:)
    猜你喜欢
    • 2015-03-27
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2015-10-07
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多