【问题标题】:Golang program giving incorrect result in Windows 10Golang 程序在 Windows 10 中给出不正确的结果
【发布时间】:2019-06-08 20:44:36
【问题描述】:

首先,我是 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(go 版本 go1.12.5 windows/amd64)中得到以下输出:

1
2
0
]1 2 3

我在 Linux Elementary OS (go version go1.12.5 linux/amd64) 中得到以下输出

1
2
3
[1 2 3]

谁能解释为什么会这样?

【问题讨论】:

  • 你试过做go build然后执行.exe文件吗?
  • @ParnabSanyal 是的,我已经尝试过这样做,并且在 Windows 10 PC 上得到了相同的结果。
  • 不要忽略错误,windows 使用\r\n 换行。
  • 我在终端@JimB 中没有收到任何错误
  • 您忽略了来自ParseInt 的错误值。尝试打印您阅读的文字字符串。

标签: go


【解决方案1】:

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

ParseInt on 3\r 返回 0 并可能返回错误 - 您明确忽略。这就是您在 Windows 上获得120 的输出的原因。此外,Windows 上的数组将打印为[1 2 3\r]。由于\r 将输出光标设置到当前行的开头并且不会移动到下一行(这就是\n 会做的事情),这有效地用最后的] 覆盖了初始[,导致] 1 2 3 的可见输出。

【讨论】:

  • 解释得很漂亮
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 2012-08-27
  • 2017-12-14
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多