處理檔案時,通常需要從特定行號繼續讀取檔案。 bufio套件中的Scanner類型可以擴充支援該功能。
使用Scanner的問題在於缺乏線路定位功能。但是,我們可以建立一個自訂的 SplitFunc,它根據換行符拆分輸入,並傳回讀取的字元數以維持檔案位置。
func scanLinesWithPosition(data []byte, atEOF bool) (advance int, token []byte, err error) { advance, token, err = bufio.ScanLines(data, atEOF) pos += int64(advance) return }
此 SplitFunc 將位置變數遞增為數字讀取的字元數。
接下來,我們需要修改掃描器以使用我們自訂的 SplitFunc。
func withScannerAtPosition(input io.ReadSeeker, start int64) error { fmt.Println("--SCANNER, start:", start) if _, err := input.Seek(start, 0); err != nil { return err } scanner := bufio.NewScanner(input) scanner.Split(scanLinesWithPosition) for scanner.Scan() { fmt.Printf("Pos: %d, Scanned: %s\n", pos, scanner.Text()) } return scanner.Err() }
中在此範例中,我們讀取範例檔案並使用行號列印其內容:
func main() { input := strings.NewReader("first\r\nsecond\nthird\nfourth") if err := withScannerAtPosition(input, 0); err != nil { fmt.Println("Scanner error:", err) } }
--SCANNER, start: 0 Pos: 7, Scanned: first Pos: 14, Scanned: second Pos: 20, Scanned: third Pos: 26, Scanned: fourth
以上是如何使用 Go 中的掃描器從特定行繼續讀取檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!