package main import ( "bufio" "io" ) // 用于逐字符读取的辅助 Reader,提供行号支持 type NumberdReader struct { reader *bufio.Reader line int lastRune rune } func NewNumberdReader(reader io.Reader) *NumberdReader { return &NumberdReader{ reader: bufio.NewReader(reader), line: 1, lastRune: -1, } } func (reader *NumberdReader) ReadRune() (r rune, size int, err error) { r, size, err = reader.reader.ReadRune() reader.lastRune = r if r == '\n' { reader.line++ } return r, size, err } func (reader *NumberdReader) UnreadRune() error { err := reader.reader.UnreadRune() if err == nil { if reader.lastRune == '\n' { reader.line-- } reader.lastRune = -1 } return err } func (reader *NumberdReader) SkipLine() error { reader.line++ reader.lastRune = -1 _, err := reader.reader.ReadBytes('\n') return err } func (reader *NumberdReader) Line() int { return reader.line }