在上面的程序中,在第15行,我们使用Write方法将一个字节片写到/home/naveen目录下名为bytes的文件中。你可以把这个目录换成另一个。剩下的程序是不言自明的。这个程序将打印11 bytes written successfully,它将创建一个名为bytes的文件。打开该文件,你可以看到它包含文本hello bytes
funcmain() { f, err := os.Create("lines") if err != nil { fmt.Println(err) f.Close() return } d := []string{"Welcome to the world of Go1.", "Go is a compiled language.", "It is easy to learn Go."}
for _, v := range d { fmt.Fprintln(f, v) if err != nil { fmt.Println(err) return } } err = f.Close() if err != nil { fmt.Println(err) return } fmt.Println("file written successfully") }
在上述程序的第9行,我们创建一个名为lines的新文件。在第17行,我们使用for range循环遍历数组,并使用Fprintln函数将这些行写到文件中。Fprintln函数以io.writer为参数,附加一个新行,这正是我们想要的。运行这个程序将打印file written successfully,并在当前目录下创建一个文件lines。文件lines的内容在下面提供。
1 2 3
Welcome to the world of Go1. Go is a compiled language. It is easy to learn Go.
追加到一个文件
在这一节中,我们将在上一节中创建的lines文件中再添加一行。我们将在lines文件中添加 “File handling is easy“这一行。
funcproduce(data chanint, wg *sync.WaitGroup) { n := rand.Intn(999) data <- n wg.Done() }
funcconsume(data chanint, done chanbool) { f, err := os.Create("concurrent") if err != nil { fmt.Println(err) return } for d := range data { _, err = fmt.Fprintln(f, d) if err != nil { fmt.Println(err) f.Close() done <- false return } } err = f.Close() if err != nil { fmt.Println(err) done <- false return } done <- true }
funcmain() { data := make(chanint) done := make(chanbool) wg := sync.WaitGroup{} for i := 0; i < 100; i++ { wg.Add(1) go produce(data, &wg) } go consume(data, done) gofunc() { wg.Wait() close(data) }() d := <-done if d == true { fmt.Println("File written successfully") } else { fmt.Println("File writing failed") } }
第44行的for循环用于创建100个goroutine。第49行中的goroutine调用了wait(),等待所有100个goroutine完成随机数的生成。在这之后,它关闭了通道。一旦通道被关闭,并且consume goroutine已经完成了将所有生成的随机数写入文件,它在第37行向done的通道写入true。main goroutine就解除了封锁,并打印File written successfully。