为什么将ReadString()操作的结果切片会导致奇怪的输出?

package main

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

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

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

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

    return
}

Running the code:

Input: thing
thing"
"hing

Why does the second concatenation behave oddly? It should produce identical results, assuming the ReadString() operation returns a string with a newline at the end. Please explain what is going on here.

That's because you're presumably on windows.

The actual input you make from your keyboard is not thing but thing

So when you do fmt.Println(input[:len(input)-1] + "\"") it only truncates the latest and leaves .

So the terminal prints thing, then reaches that returns carriage to the beginning of the string, then you print a double quote. But the carriage is in the first position now, and it effectively overwrites the first character of the line, leaving you with "hing