使用golang语言去读写一个文件会有多种方式,这里先从io/ioutil包开始。io/ioutil包提供了以下函数供用户调用:

1[root@localhost ~]# godoc io/ioutil|grep "func.*("
2func NopCloser(r io.Reader) io.ReadCloser
3func ReadAll(r io.Reader) ([]byte, error)
4func ReadDir(dirname string) ([]os.FileInfo, error)
5func ReadFile(filename string) ([]byte, error)
6func TempDir(dir, prefix string) (name string, err error)
7func TempFile(dir, prefix string) (f *os.File, err error)
8func WriteFile(filename string, data []byte, perm os.FileMode) error

一、文件读取

从上面的godoc帮助文档中,可以看到ReadAll和ReadFile方法是用于文件读取的,两者所不同的是传的参不一样,一个io对象,一个是文件名,但最终返回的都是一个byte类型的数据。

 1/*
 2code from www.361way.com
 3read whole file use ReadFile func
 4*/
 5package main
 6import (
 7    "fmt"
 8    "io/ioutil"
 9    //"strings"
10)
11func main() {
12    Ioutil("/etc/passwd")
13}
14func Ioutil(name string) {
15    if contents, err := ioutil.ReadFile(name); err == nil {
16        if len(contents) > 0 {
17            s := contents[:len(contents)-1]
18            fmt.Println(string(s))
19        } else {
20            fmt.Println(string(contents))
21        }
22    }
23}

上面的读取的结果默认会多一个换行,如果认为无影响,可以直接if contents, err := ioutil.ReadFile(name); err nil读取后就Println结果就行了。结果想要处理就可以加上上面的判断语句进行处理,因为考虑到直接touch创建的空文件len(contents)是0,进行切片时会越界。

很多网上找到的代码是result := strings.Replace(string(contents), “\n”, “”, 1) 使用这样的语句处理多出来的一行的,这个处理是不正确的,这个会把第一个换行替换为空。多行的文件,会将第一二行合并在一起,而且最后打印出的内容也多出一个空行。这点和python不同,其不支持 -1 替换,所以重好用上面的方法进行处理。

二、写文件

 1package main
 2import (
 3    "fmt"
 4    "io/ioutil"
 5)
 6func main() {
 7      name := "testwritefile.txt"
 8      content := "Hello, www.361way.com!\n"
 9      WriteWithIoutil(name,content)
10}
11//使用ioutil.WriteFile方式写入文件,是将[]byte内容写入文件,如果content字符串中没有换行符的话,默认就不会有换行符
12func WriteWithIoutil(name,content string) {
13    data :=  []byte(content)
14    if ioutil.WriteFile(name,data,0666) == nil {
15        fmt.Println("写入文件成功:",content)
16        }
17    }

以下点需要注意下:

1、如果文件存在,则是覆盖写入,不是追加写入;

2、这里的设置的权限0666经测试发现并不生效,其最终文件权限是受umask值影响的。如果默认umask是002,则写入后文件的权限是644。