原文: https://studygolang.com/articles/2271
package main import ( "fmt" "strings" "log" ) func main() { reader := strings.NewReader("Go語言學習園地") reader.Seek(2, 0) r, _, _ := reader.ReadRune() fmt.Printf("%c\n", r) str := "Go語言學習園地" log.Println([]byte(str)) }
--------------------
讀者是否發現,其實ReaderFrom和WriterTo接口的方法接收的參數是io.Reader和io.Writer類型。根據io.Reader和io.Writer接口的講解,對該接口的使用應該可以很好的掌握。
這里只提供簡單的一個示例代碼:將一段文本輸出到標准輸出
reader := bytes.NewReader([]byte("Go語言學習園地"))
reader.WriteTo(os.Stdout)
通過io.ReaderFrom和io.WriterTo的學習,我們知道,如果這樣的需求,可以考慮使用這兩個接口:“一次性從某個地方讀或寫到某個地方去。”
## Seeker接口 ##
接口定義如下:
type Seeker interface { Seek(offset int64, whence int) (ret int64, err error) }
官方文檔中關於該接口方法的說明:
> Seek 設置下一次 Read 或 Write 的偏移量為 offset,它的解釋取決於 whence: 0 表示相對於文件的起始處,1 表示相對於當前的偏移,而 2 表示相對於其結尾處。 Seek 返回新的偏移量和一個錯誤,如果有的話。
也就是說,Seek方法用於設置偏移量的,這樣可以從某個特定位置開始操作數據流。聽起來和ReaderAt/WriteAt接口有些類似,不過Seeker接口更靈活,可以更好的控制讀寫數據流的位置。
簡單的示例代碼:獲取倒數第二個字符(需要考慮UTF-8編碼,這里的代碼只是一個示例
-------------
**小貼士**
whence的值,在os包中定義了相應的常量,應該使用這些常量
const (
SEEK_SET int = 0 // seek relative to the origin of the file
SEEK_CUR int = 1 // seek relative to the current offset
SEEK_END int = 2 // seek relative to the end
)
## Closer接口 ##
接口定義如下:
type Closer interface { Close() error }
該接口比較簡單,只有一個Close()方法,用於關閉數據流。