我正在尝试读取“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
这取决于您要尝试做什么。
file, err := os.Open("file.txt") fmt.print(file)
它输出 &{0xc082016240} 的原因是因为您正在打印文件描述符 ( *os.File)的指针值,而不是文件内容。要获取文件内容,您可以READ从文件描述符中获取。
*os.File
READ
要将所有文件内容(以字节为单位)读取到内存中, ioutil.ReadAll
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) }
但有时,如果文件很大,只读取块可能更节省内存:缓冲区大小,因此您可以使用io.Reader.Readfrom的实现*os.File
io.Reader.Read
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 } } }
否则,您也可以使用标准的 util 包:bufio, try Scanner。AScanner在标记中读取您的文件:分隔符。
bufio
Scanner
默认情况下,扫描仪通过换行符推进标记(当然,您可以自定义扫描仪如何标记您的文件,从这里学习bufio 测试)。
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 } }