首页 > 解决方案 > 为什么切片 ReadString() 操作的结果会导致奇怪的输出?

问题描述

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() 操作返回一个结尾带有换行符的字符串。请解释这里发生了什么。

标签: goconcatenation

解决方案


那是因为你大概在窗户上。

您从键盘进行的实际输入thing\n不是thing\r\n

所以当你这样做时,fmt.Println(input[:len(input)-1] + "\"")它只会截断最新的\n并离开\r

所以终端打印thing,然后到达\r将回车返回到字符串的开头,然后打印双引号。但是马车现在在第一个位置,它有效地覆盖了行的第一个字符,给你留下了"hing


推荐阅读