Go版本
go版本 go1.21.6 darwin/arm64
在你的模块/工作区中go env
的输出:
GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/larsmeyer/Library/Caches/go-build'
GOENV='/Users/larsmeyer/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/larsmeyer/go/pkg/mod'
GONOPROXY='<redacted>'
GONOSUMDB='<redacted>'
GOOS='darwin'
GOPATH='/Users/larsmeyer/go'
GOPRIVATE='<redacted>'
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/opt/homebrew/Cellar/go/1.21.6/libexec'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/opt/homebrew/Cellar/go/1.21.6/libexec/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.21.6'
GCCGO='gccgo'
AR='ar'
CC='cc'
CXX='c++'
CGO_ENABLED='1'
GOMOD='/Users/larsmeyer/src/bufiotest/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/z6/xqtk238d3fv7krs5hmpsnlr40000gn/T/go-build33939231=/tmp/go-build -gno-record-gcc-switches -fno-common'
你做了什么?
我创建了一个Scanner
,其输入包含一行比MaxScanTokenSize
更长的文本。由于代码过大,无法在go.dev/play中使用,因此将其作为ZIP附件附加。
bufiotest.zip
你看到了什么?
当遇到Scan()
时,如预期的那样返回了false
。Err()
也如预期的那样返回了ErrTooLong
。然而,Bytes()
出乎意料地返回了nil
。只有随后对Scan()
的再次调用(这是最后一次)才使Bytes()
非空,返回最后读取的MaxScanTokenSize
字节。
你期望看到什么?
当Scan()
首次返回false
时,Bytes()
应立即返回最后读取的MaxScanTokenSize
字节。我不理解这里的逻辑:
go/src/bufio/scan.go
第193行至第196行:
| | iflen(s.buf) >=s.maxTokenSize||len(s.buf) >maxInt/2 { |
| | s.setErr(ErrTooLong) |
| | returnfalse |
| | } |
从我的阅读来看,其他错误,如底层的io.Reader
的I/O错误,不会立即导致返回,因此当Scan()
首次返回false
时,x1m22n1x会立即返回剩余的缓冲区:
go/src/bufio/scan.go
第220行至第223行:
| | iferr!=nil { |
| | s.setErr(err) |
| | break |
| | } |
1条答案
按热度按时间93ze6v8z1#
文档并没有明确说明在
Scan
返回false且Err
返回非nil错误后,Bytes
将返回什么。cc @griesemer@bradfitz@ianlancetaylor