Почему нарезка результата операции ReadString () приводит к странным выводам? - PullRequest
0 голосов
/ 13 декабря 2018
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)

    fmt.Printf("Input: ")
    input, _ := reader.ReadString('\n')

    fmt.Println("thing\n"[:5] + "\"")
    fmt.Println(input[:len(input)-1] + "\"")

    return
}

Выполнение кода:

Input: thing
thing"
"hing

Почему вторая конкатенация ведет себя странно?Он должен давать идентичные результаты, предполагая, что операция ReadString () возвращает строку с новой строкой в ​​конце.Пожалуйста, объясните, что здесь происходит.

1 Ответ

0 голосов
/ 14 декабря 2018

Это потому, что вы, вероятно, работаете в Windows.

Фактический ввод, который вы вводите с клавиатуры, не thing\n, а thing\r\n

Так что, когда вы делаете fmt.Println(input[:len(input)-1] + "\""), это толькоусекает последнюю \n и оставляет \r.

Таким образом, терминал печатает thing, затем достигает \r, который возвращает каретку в начало строки, а затем вы печатаете двойную кавычку.Но теперь каретка находится на первой позиции, и она фактически перезаписывает первый символ строки, оставляя вас с "hing

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