Go

时间:2018-11-25 12:36:49

标签: arrays go slice

我想输入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中最大的字符串切片大小是多少?如何处理?

2 个答案:

答案 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))
}

说明:

  1. bufio.Scanner帮助“扫描”特定输入并将其以您喜欢的任何方式拆分。默认情况下,它拆分为新行。这使我们排名第二。
  2. bufio.ScanWords是一种在空格(包括换行符)上分割字节的函数。这定义了inputScanner的行为。
  3. 接下来是我们存储数据的字符串切片。它使用0个元素初始化,并且可以容纳200,000个字符串。这样可以优化分配时间。
  4. 打印!!