1. 问题描述
在使用Golang开发一个项目的时候,在小测试中没有问题,但是在后来使用的时候发生了一个很奇怪的错误,在此留下记录,以便后续回忆。
Golang通过terminal读取字符串的长度有限,保持在4096的大小
2. 问题详情
下面是源代码:
// MustReadStdin blocks until input is received from stdin
func MustReadStdin() string {
r := bufio.NewReader(os.Stdin)
var in string
for {
var err error
in, err = r.ReadString('\n')
if err != io.EOF {
if err != nil {
panic(err)
}
}
in = strings.TrimSpace(in)
if len(in) > 0 {
break
}
}
fmt.Println("successfully read a String from stdin:")
return in
}
在普通的测试中都可以进行,例如:
go run main.go
abcdedge
successfully read a String from stdin:
abcdedge
但是一旦到了一个特别大的字符串的时候就会出问题,一路排查才发现,在源文件 /usr/local/opt/go/libexec/src/bufio/bufio.go
中有定义
const (
defaultBufSize = 4096
)
// NewReader returns a new Reader whose buffer has the default size.
func NewReader(rd io.Reader) *Reader {
return NewReaderSize(rd, defaultBufSize)
}
也就是终端不能在一行中输入超过4096个字符长度的字符串。
3.解决方案
实际上我没有发现有效的解决方案,最后我是将这个 read
操作进入了文件中。
关于这个问题还有个帖子可以查看,链接一并放出:
golang: read long string from shell