我有很多小文件,我不想一行一行地看。

在Go中是否有一个函数可以将整个文件读入字符串变量?


当前回答

如果您只想要内容作为字符串,那么简单的解决方案是使用io/ioutil包中的ReadFile函数。这个函数返回一个字节片,您可以很容易地将其转换为字符串。

使用1.16或更高版本

在本例中,用os替换ioutil。

package main

import (
    "fmt"
    "os"
)

func main() {
    b, err := os.ReadFile("file.txt") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }

    fmt.Println(b) // print the content as 'bytes'

    str := string(b) // convert content to a 'string'

    fmt.Println(str) // print the content as a 'string'
}

使用1.15或更早版本

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    b, err := ioutil.ReadFile("file.txt") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }

    fmt.Println(b) // print the content as 'bytes'

    str := string(b) // convert content to a 'string'

    fmt.Println(str) // print the content as a 'string'
}

其他回答

我是这样做的:

package main

import (
  "fmt"
  "os"
  "bytes"
  "log"
)

func main() {
   filerc, err := os.Open("filename")
   if err != nil{
     log.Fatal(err)
   }
   defer filerc.Close()

   buf := new(bytes.Buffer)
   buf.ReadFrom(filerc)
   contents := buf.String()

   fmt.Print(contents) 

}    

如果您只想要内容作为字符串,那么简单的解决方案是使用io/ioutil包中的ReadFile函数。这个函数返回一个字节片,您可以很容易地将其转换为字符串。

使用1.16或更高版本

在本例中,用os替换ioutil。

package main

import (
    "fmt"
    "os"
)

func main() {
    b, err := os.ReadFile("file.txt") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }

    fmt.Println(b) // print the content as 'bytes'

    str := string(b) // convert content to a 'string'

    fmt.Println(str) // print the content as a 'string'
}

使用1.15或更早版本

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    b, err := ioutil.ReadFile("file.txt") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }

    fmt.Println(b) // print the content as 'bytes'

    str := string(b) // convert content to a 'string'

    fmt.Println(str) // print the content as a 'string'
}

我认为最好的办法,如果你真的关心连接所有这些文件的效率,就是把它们都复制到同一个字节缓冲区。

buf := bytes.NewBuffer(nil)
for _, filename := range filenames {
  f, _ := os.Open(filename) // Error handling elided for brevity.
  io.Copy(buf, f)           // Error handling elided for brevity.
  f.Close()
}
s := string(buf.Bytes())

这将打开每个文件,将其内容复制到buf中,然后关闭该文件。根据您的情况,您可能实际上不需要转换它,最后一行只是显示buf.Bytes()有您正在寻找的数据。

对于Go 1.16或更高版本,您可以在编译时读取文件。

使用//go:embed指令和go 1.16中的embed包

例如:

package main

import (
    "fmt"
    _ "embed"
)

//go:embed file.txt
var s string

func main() {
    fmt.Println(s) // print the content as a 'string'
}

使用ioutil。ReadFile:

func ReadFile(filename string) ([]byte, error)

ReadFile读取以filename命名的文件并返回内容。通话成功 返回err == nil,而不是err == EOF。因为ReadFile读取整个文件,所以它不进行处理 Read中的EOF作为要报告的错误。

您将得到一个[]字节而不是字符串。如果确实需要,可以转换:

s := string(buf)