1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
這取決于您要嘗試做什么。
file, err := os.Open("file.txt")
fmt.print(file)
它輸出 &{0xc082016240} 的原因是因?yàn)槟诖蛴∥募枋龇?( *os.File)的指針值,而不是文件內(nèi)容。要獲取文件內(nèi)容,您可以READ從文件描述符中獲取。
要將所有文件內(nèi)容(以字節(jié)為單位)讀取到內(nèi)存中, 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 func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
b, err := ioutil.ReadAll(file)
fmt.Print(b)
}
但有時(shí),如果文件很大,只讀取塊可能更節(jié)省內(nèi)存:緩沖區(qū)大小,因此您可以使用io.Reader.Readfrom的實(shí)現(xiàn)*os.File
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
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
}
}
}
否則,您也可以使用標(biāo)準(zhǔn)的 util 包:bufio, try Scanner。AScanner在標(biāo)記中讀取您的文件:分隔符。
默認(rèn)情況下,掃描儀通過(guò)換行符推進(jìn)標(biāo)記(當(dāng)然,您可以自定義掃描儀如何標(biāo)記您的文件,從這里學(xué)習(xí)bufio 測(cè)試)。
package main
import (
"fmt"
"os"
"log"
"bufio"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
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
}
}
最后,我還想向您推薦這個(gè)很棒的網(wǎng)站:go-lang filecheatsheet。它幾乎涵蓋了與在 go-lang 中處理文件相關(guān)的所有內(nèi)容,希望您會(huì)發(fā)現(xiàn)它很有用。
- 1 回答
- 0 關(guān)注
- 187 瀏覽
添加回答
舉報(bào)