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