我正在尝试阅读“file.txt”并使用Golang将内容放入变量中。这是我试过的......
package main
import (
"fmt"
"os"
"log"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
fmt.Print(file)
}
文件被成功读取, os.Open 的返回返回 * os.File
的类型答案 0 :(得分:119)
仅需要io/ioutil
个包。
如果您只想将内容设为string
,那么简单的解决方案就是使用ReadFile
包中的io/ioutil
函数。此函数返回bytes
的切片,您可以轻松将其转换为string
。
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'
}
答案 1 :(得分:39)
这取决于你想要做什么。
file, err := os.Open("file.txt")
fmt.print(file)
它输出& {0xc082016240}的原因是因为您正在打印文件描述符(*os.File
)的指针值,而不是文件内容。要获取文件内容,您可以从文件描述符中READ
。
要将所有文件内容(以字节为单位)读取到内存ioutil.ReadAll
package main
import (
"fmt"
"os"
"log"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
b, err := ioutil.ReadAll(file)
fmt.Print(b)
}
但有时候,如果文件大小很大,那么只读取块大小可能会更节省内存:buffer-size,因此你可以使用来自io.Reader.Read
的{{1}}的实现
*os.File
否则,您也可以使用标准的util包:func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
buf := make([]byte, 32*1024) // define your buffer size here.
for {
n, err := file.Read(buf)
if n > 0 {
fmt.Print(buf[:n]) // your read buffer.
}
if err == io.EOF {
break
}
if err != nil {
log.Printf("read %d bytes: %v", n, err)
break
}
}
}
,尝试bufio
。 Scanner
在令牌中读取您的文件:分隔符。
默认情况下,扫描程序按换行符推进令牌(当然,您可以自定义扫描程序如何标记文件,请从此处了解the bufio test)。
Scanner
最后,我还想向您推荐这个令人敬畏的网站:go-lang file cheatsheet。它包含了与在go-lang中处理文件相关的几乎所有内容,希望您会发现它很有用。