Golang程式在Windows 10中产生不正确的结果

时间:2019-06-08 20:44:36

标签: go

首先,我是Go编程的新手。我有一个简单的Golang程序,该程序可以在Linux环境中提供正确的输出,但在我的Windows 10 PC中却不能。

代码如下:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter text: ")
    text, _ := reader.ReadString('\n')
    tarr := strings.Split(strings.Trim(text, "\n"), " ")

    for i := 0; i < len(tarr); i++ {
        num, _ := strconv.ParseInt(tarr[i], 10, 32)
        fmt.Println(num)
    }

    fmt.Println(tarr)
    reader.ReadString('\n')
}

如果我从终端输入1 2 3作为输入,我将在Windows 10中获得以下输出(版本go1.12.5 windows / amd64):

1
2
0
]1 2 3

我在Linux Elementary OS(go 1.12.5 linux / amd64版本)中得到以下输出

1
2
3
[1 2 3]

谁能解释为什么会这样?

1 个答案:

答案 0 :(得分:8)

尽管UNIX(和Linux)的行尾为\n,但Windows的行尾为\r\n。这意味着您在Linux上读到的行是1 2 3\n,而在Windows上读到的行是1 2 3\r\n。如果现在删除\n(即strings.Trim(text, "\n"))并按空格分割,则在Linux上会分别得到123,但您会得到{{ 1}},12在Windows上。

3\r上的

ParseInt返回3\r并可能返回错误-您将其忽略。这就是为什么在Windows上获得012的输出的原因。同样,Windows上的数组将打印为0。由于[1 2 3\r]将输出光标设置为当前行的开头,并且不会移动到下一行(\r会这样做),因此这有效地覆盖了初始\n和最后一个{ {1}},产生[的可见输出。