写文件
写入字符串
经常会遇到向文件中写入字符串的需求,实现起来很简单,包括如下两步:
创建文件
将字符串写入创建的文件
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Create("test.txt")
if err != nil {
fmt.Println(err)
return
}
l, err := f.WriteString("Hello World 你好 世界")
if err != nil {
fmt.Println(err)
f.Close()
return
}
fmt.Println(l, "bytes written successfully")
err = f.Close()
if err != nil {
fmt.Println(err)
return
}
}通过os.Create函数,创建了文件test.txt,该函数返回了创建的文件的文件描述符。注意,如果要创建的文件名称已存在,存在的文件会被删除。我们通过WriteString方法向文件中写入了字符串Hello World 你好 世界,该方法返回写入的字符串的字节数。最后注意通过f.Close()关闭文件。该程序执行输出:
同时生成一个文件test.txt,包含文本Hello World 你好 世界。
写入字节
向文件中写入字节跟写入字符串类似。使用Write方法即可。下面的程序将一个切片的字节写入到文件中。
这里我们打开文件后,通过Write方法将一个切片的字节写入文件。该程序执行输出:
同时创建了文件bytes.txt,包含文本hello world。
按行写入字符串
下面我们将如下几行字符串按行写入文件。
这里我们还是通过os.Create()来创建了一个文件。接着通过Fprintln函数将一行一行的字符串写入到了文件中。最后关闭了文件。该程序执行输出:
同时创建了文件lines.txt,包含了三行文本。
追加写入字符串
下面我们将下面这行文本追加写入到前面创建的文件lines.txt中。
要追加写入一个文件,该文件必须以追加模式打开。OpenFile函数的参数可配置以哪种模式打开文件。
这里我们给函数OpenFile传入了os.O_APPEND|os.O_WRONLY表示追加+仅写模式。该程序执行输出:
同时在文件lines.txt最后追加了一行文本File handling is easy.。
并发写文件
如果多个goroutine并发的向同一个文件写入,会出现竞态问题。这种情况下我们需要通过channel,来将所有goroutine要写入的数据做一个顺序化,跟排队类似。这本质上其实也是生产消费模型。
下面我们创建100个goroutine,在每个goroutine中并发的生成一个随机数,然后放入到channel中。在channel的接收端会收到来自各个goroutine要写入的数据,然后依次无冲突的写入到文件中。
这里的核心思想就是生产、消费模型,produce协程函数用来生产数据,consume协程用来消费数据。这里我们通过wg.Wait()在所有生产者完成生产后调用close关闭了channel。同时我们在consume协程中不断读取channel中的数据,直到channel被关闭。consume协程完成按序写后调用f.Close()关闭了文件。该程序执行输出为:
同时创建了文件concurrent.txt,包含100行随机数字。
Last updated
Was this helpful?