# Go 讀取文件
讀寫文件是很多程序的基本任務,下面我們看看Go里面的文件讀取。
```go
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)
// 讀取文件的函數調用大多數都需要檢查錯誤,
// 使用下面這個錯誤檢查方法可以方便一點
func check(e error) {
if e != nil {
panic(e)
}
}
func main() {
// 最基本的文件讀寫任務就是把整個文件的內容讀取到內存
dat, err := ioutil.ReadFile("/tmp/dat")
check(err)
fmt.Print(string(dat))
// 有的時候你想更多地控制到底是讀取文件的哪個部分,這個
// 時候你可以使用`os.Open`打開一個文件獲取一個`os.File`
// 對象
f, err := os.Open("/tmp/dat")
// 從這個文件中讀取一些字節,并且由于字節數組長度所限,
// 最多讀取5個字節,另外還需要注意實際能夠讀取的字節
// 數量
b1 := make([]byte, 5)
n1, err := f.Read(b1)
check(err)
fmt.Printf("%d bytes: %s\n", n1, string(b1))
// 你也可以使用`Seek`來跳轉到文件中的一個已知位置,并從
// 那個位置開始讀取數據
o2, err := f.Seek(6, 0)
check(err)
b2 := make([]byte, 2)
n2, err := f.Read(b2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n2, o2, string(b2))
// `io`包提供了一些幫助文件讀取的函數。例如上面的方法如果
// 使用方法`ReadAtLeast`函數來實現,將使得程序更健壯
o3, err := f.Seek(6, 0)
check(err)
b3 := make([]byte, 2)
n3, err := io.ReadAtLeast(f, b3, 2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))
// 沒有內置的rewind方法,但是可以使用`Seek(0,0)`來實現
_, err = f.Seek(0, 0)
check(err)
// `bufio`包提供了緩沖讀取文件的方法,這將使得文件讀取更加
// 高效
r4 := bufio.NewReader(f)
b4, err := r4.Peek(5)
check(err)
fmt.Printf("5 bytes: %s\n", string(b4))
// 最后關閉打開的文件。一般來講這個方法會在打開文件的時候,
// 使用defer來延遲關閉
f.Close()
}
```
在運行程序之前,你需要創建一個`/tmp/dat`文件,然后寫入一些測試數據。
運行結果
```
hello world
i am jemy
who are you
what do you like
5 bytes: hello
2 bytes @ 6: wo
2 bytes @ 6: wo
5 bytes: hello
```
- 版權
- 內容
- Go常量
- Go變量
- Go 數值
- Go 數組
- Go 字典
- Go 函數定義
- Go 方法
- Go 結構體
- Go 閉包函數
- Go 接口
- Go 字符串操作函數
- Go 字符串格式化
- Go 自定義排序
- Go Base64編碼
- Go Defer
- Go Exit.md
- Go for循環
- Go if..else if..else 條件判斷
- Go JSON支持
- Go Line Filters
- Go 狀態協程
- Go Panic
- Go range函數
- Go SHA1 散列
- Go String與Byte切片之間的轉換
- Go Switch語句
- Go URL解析
- Go 遍歷通道
- Go 并行功能
- Go 并行通道Channel
- Go 超時
- Go 錯誤處理
- Go 打點器
- Go 遞歸函數
- Go 讀取文件
- Go 工作池
- Go 關閉通道
- Go 函數多返回值
- Go 函數回調
- Go 函數命名返回值
- Go 互斥
- Go 環境變量
- Go 集合功能
- Go 計時器
- Go 進程觸發
- Go 進程執行
- Go hello world
- Go 可變長參數列表
- Go 命令行參數
- Go 命令行參數標記
- Go 排序
- Go 切片
- Go 請求處理頻率控制
- Go 時間
- Go 時間戳
- Go 時間格式化和解析
- Go 數字解析
- Go 隨機數
- Go 通道的同步功能
- Go 通道方向
- Go 通道緩沖
- Go 通道選擇Select
- Go 寫入文件
- Go 信號處理
- Go 原子計數器
- Go 正則表達式
- Go 指針