Программа Golang дает неверный результат в Windows 10 - PullRequest
2 голосов
/ 08 июня 2019

Прежде всего, я новичок в программировании на Go. У меня есть простая программа Golang, которая дает правильный вывод в среде Linux, но не на моем компьютере с Windows 10.

Код выглядит следующим образом:

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 (версия go1.12.5 linux / amd64)

1
2
3
[1 2 3]

Может кто-нибудь объяснить, почему это происходит?

1 Ответ

8 голосов
/ 09 июня 2019

В то время как UNIX (и Linux) имеют конец строки \n В Windows конец строки \r\n.Это означает, что строка, которую вы прочитали в Linux, - 1 2 3\n, а в Windows - 1 2 3\r\n.Если вы теперь удалите \n (то есть strings.Trim(text, "\n")) и разделите по пробелам, вы получите 1, 2 и 3 в Linux, но вы получите 1, 2, 3\r наWindows.

ParseInt on 3\r возвращает 0 и, вероятно, возвращает ошибку - которую вы явно игнорируете.Вот почему вы получаете выходные данные 1, 2 и 0 в Windows.Кроме того, массив в Windows будет напечатан как [1 2 3\r].Поскольку \r устанавливает выходной курсор в начало текущей строки и не перемещается на следующую строку (это то, что делает \n), это фактически переопределяет начальный [ с последним ], что приводит квидимый вывод ] 1 2 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...