这取决于您要执行的 *** 作。
file, err := os.Open("file.txt")fmt.print(file)
它输出&{0xc082016240}的原因是因为您正在打印文件描述符(
*os.File)的指针值,而不是文件内容。要获取文件内容,可以
READ从文件描述符中获取。
要将所有文件内容(以字节为单位)读取到内存,
ioutil.ReadAll
package mainimport ( "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)}
但是有时,如果文件很大,则仅读取块可能会提高内存效率:缓冲区大小,因此可以使用
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 } }}
否则,您也可以使用标准的util软件包:
bufio,尝试
Scanner。A
Scanner使用令牌:分隔符读取文件。
默认情况下,扫描程序通过换行符使令牌前进(当然,您可以自定义扫描程序应如何对文件进行令牌化,可以从bufio测试中了解)。
package mainimport ( "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 unipre-char fmt.Println(scanner.Bytes()) // token in bytes }}
最后,我还想向您推荐这个很棒的网站:go-lang file
cheatsheet。它包含了与在go-
lang中处理文件有关的几乎所有内容,希望您会发现它有用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)