我正在尝试阅读"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)
}
Run Code Online (Sandbox Code Playgroud)
文件被成功读取,os.Open的返回返回一个*os.File类型
Roy*_*Lee 66
这取决于你想要做什么.
file, err := os.Open("file.txt")
fmt.print(file)
Run Code Online (Sandbox Code Playgroud)
它输出&{0xc082016240}的原因是因为您要打印文件描述符(*os.File)的指针值,而不是文件内容.要获取文件内容,您可以READ从文件描述符中获取.
要读取所有文件内容(以字节为单位)到内存, ioutil.ReadAll
package main
import (
"fmt"
"io/ioutil"
"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)
}
Run Code Online (Sandbox Code Playgroud)
但有时候,如果文件大小很大,那么只读取块的内存效率可能更高:buffer-size,因此你可以使用io.Reader.Readfrom 的实现*os.File
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
否则,您也可以使用标准的util包:bufio,试试Scanner.A Scanner在令牌中读取您的文件:分隔符.
默认情况下,扫描程序按换行推进令牌(当然,您可以自定义扫描程序如何标记您的文件,从这里学习bufio测试).
package main
import (
"fmt"
"os"
"log"
"bufio"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() { // internally, it advances token based on sperator
fmt.Println(scanner.Text()) // token in unicode-char
fmt.Println(scanner.Bytes()) // token in bytes
}
}
Run Code Online (Sandbox Code Playgroud)
最后,我还想向您介绍这个令人敬畏的网站:go-lang文件cheatsheet.它包含了与在go-lang中处理文件相关的几乎所有内容,希望您会发现它很有用.
| 归档时间: |
|
| 查看次数: |
95723 次 |
| 最近记录: |