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

时间:2018-12-13 20:50:01

标签: go concatenation

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 :(得分:2)

那是因为您大概在Windows上。

您从键盘上实际输入的不是thing\n,而是thing\r\n

因此,当您执行fmt.Println(input[:len(input)-1] + "\"")时,它只会截断最新的\n并留下\r

因此,终端打印thing,然后到达\r,该字符将回车返回到字符串的开头,然后打印双引号。但是笔架现在处于第一个位置,它有效地覆盖了该行的第一个字符,使您剩下"hing