我想输入200000个空格分隔的任意数字字符串。使用bufio.Reader
进行输入时,只需输入其中的几个即可。这是代码:
package main
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)
func main() {
reader := bufio.NewReaderSize(os.Stdin, 1024*1024)
scoresTemp := strings.Split(readLine(reader), " ")
fmt.Println(scoresTemp)
fmt.Println("---")
fmt.Println(len(scoresTemp))
}
func readLine(reader *bufio.Reader) string {
str, _, err := reader.ReadLine()
if err == io.EOF {
return ""
}
return strings.TrimRight(string(str), "\r\n")
}
切片长度应为200000,但仅需要410个项目。如果我增加阅读器的大小,那将是相同的。 Go中最大的字符串切片大小是多少?如何处理?
答案 0 :(得分:0)
我相信您的输入问题,而不是Go代码问题。我已经在本地计算机上尝试了您的代码,并得到了以下结果:
$ for((i=0;i<200000;i++)) do echo -n "x "; done | go run main.go
...
---
200001
答案 1 :(得分:0)
您的代码对输入的迭代效果不佳。问题不在于切片。
如果需要,请尝试以下代码。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
inputScanner := bufio.NewScanner(os.Stdin)
inputScanner.Split(bufio.ScanWords)
scoresTemp := make([]string, 0, 200000)
for inputScanner.Scan() {
scoresTemp = append(scoresTemp, inputScanner.Text())
}
fmt.Println(scoresTemp)
fmt.Println("---")
fmt.Println(len(scoresTemp))
}
说明:
bufio.Scanner
帮助“扫描”特定输入并将其以您喜欢的任何方式拆分。默认情况下,它拆分为新行。这使我们排名第二。bufio.ScanWords
是一种在空格(包括换行符)上分割字节的函数。这定义了inputScanner
的行为。