Go 文件操作

Posted s686zhou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 文件操作相关的知识,希望对你有一定的参考价值。

文件分为文本文件 和 二进制文件

打开和关闭文件

os.Open() 函数能够打开一个文件,返回一个 *File 和一个 err。对得到的文件实例调用 close() 方法能够关闭文件。

package main

import (
   "fmt"
   "os"   
)

func main(){
     // 只读方式打开当前目录下的 main.go 文件
     file, err := os.Open("./main.go")
     if err != nil {
         fmt.Println("open file failed!,err:",err)
         return  
    }
     // 关闭文件
     defer file.Close()     //为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句。
}

 

 

读取文件

file.Read()

基本使用

Read方法定义如下:

func (f *File) Read(b []byte) (n int, err error)

 

循环读取

func main(){
    // 只读方式打开当前目录下的main.go 文件
    file, err := os.Open("./main.go")
    if err != nil{
          fmt.Prinln("Open file failed!,err:",err)
          return  
    }
    defer file.Close()
    // 循环读取文件
    var content []byte
    var tmp = make([]byte,128)
    for {
         n, err := file.Read(tmp)
         if err == io.EOF {
             fmt.Prinln("文件读完了")
             break
          }
          if err != nil{
               fmt.Println("read file failed,err:",err)
               return
          }
          content = append(content,tmp[:n]...)
    }
    fmt.Prinln(string(content))
}  

 

 

bufio读取文件

 

bufio是在file的基础上封装了一层API,支持更多的功能。

package main

import (
     "bufio"
     "fmt"
     "io"
     "os"
)

// bufio按行读取示例
func main() {
     file,  err := os.Open("./xx.txt")
     if err != nil {
          fmt.Prinln("open file failed, err:",err)
          return
   }
   defer file.Close()
   reader := bufio.NewReader(file)
   for {
         line, err := reader.ReadString(
) //注意是字符
         if  err == io.EOF {
              if len(line) != 0{
                  fmt.Prinln(line)
              }
              fmt.Println("文件读完了")
              break
         }
         if err != nil {
              fmt.Println("read file failed, err:",err)
              return
         }
         fmt.Print(line)
    }
}

 

ioutil读取整个文件 

io/ioutil 包的 ReadFile 方法能够读取完整的文件,只需要将文件名作为参数传入。

package main

import (
    "fmt"
    "io/ioutil"
)


// ioutil.ReadFile 读取整个文件
func main() {
       content, err := ioutil.ReadFile("./main.go")
       if err != nil {
           fmt.Println("read file failed, err:",err)
           return
     }
     fmt.Println(string(content))
}

 

 

文件写入操作

os.OpenFile() 函数能够以指定模式打开文件,从而实现文件写入相关功能。

func OpenFile(name string, flag int, perm FileMode) (*File,error){
    ...
}

 

其中:

 name: 要开打的文件名 flag : 打开文件的模式。  模式有以下几种:

os.O_WRONLY                          只写

os.O_CREATE                           创建文件

os.O_RDONLY                           只读

os.O_RDWR                              读写

os.O_TRUNC                             清空

os.O_APPEND                           追加

perm: 文件权限,一个八进制数。 r(读) 04, w (写) 02 , x(执行) 01。

Write 和 WriteString

func main() {
     file, err := os.OpenFile("xx.txt",os.O_CREATE|os.O_TRUNC|os.O_WRONLY,0666)
     if err != nil {
          fmt.Prinln("open file failed,err:",err)
          return
    }
    defer file.Close()
    str := "hello 沙河"
    file.Write([]byte(str))                 //写入字节切片数据
    file.WriteString("hello  小王子")   //直接写入字符串数据
}

 

buffio.NewWriter

func main() {
    file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
    if err != nil {
        fmt.Println("open file failed, err:", err)
        return
    }
    defer file.Close()
    writer := bufio.NewWriter(file)
    for i := 0; i < 10; i++ {
        writer.WriteString("hello沙河
")  //将数据先写入缓存
    }
    writer.Flush()      //将缓存中的内容写入文件
}

 

ioutil.WriteFile

func main() {
      str := "hello 沙河"
      err := ioutil.WriteFile("./xx.txt",[]byte(str),0666)
      if err != nil {
            fmt.Prinln(write file failed,err:",err)
            return
     }
}

 

以上是关于Go 文件操作的主要内容,如果未能解决你的问题,请参考以下文章

为每个片段添加一个操作栏

npm : 无法加载文件 D:softcodeProcess ode ode_global pm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.micr +(代码片段

解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程