go - 为什么切片 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() 操作返回一个结尾带有换行符的字符串。请解释这里发生了什么。
解决方案
那是因为你大概在窗户上。
您从键盘进行的实际输入thing\n
不是thing\r\n
所以当你这样做时,fmt.Println(input[:len(input)-1] + "\"")
它只会截断最新的\n
并离开\r
。
所以终端打印thing
,然后到达\r
将回车返回到字符串的开头,然后打印双引号。但是马车现在在第一个位置,它有效地覆盖了行的第一个字符,给你留下了"hing
推荐阅读
- php - 如何在 Joomla 3 中对逗号分隔的字段进行 MySQL 查询?
- java - 如何使用 jsoup 用 span 标签替换特定的 div 标签
- nginx - Nginx content_by_lua_block 删除请求正文?
- ios - 当键盘出现Swift时,使用文本字段和按钮向上移动视图
- javascript - 如何检查字符串是否匹配 JS 中的正则表达式?
- python - python 3.x - pyserial - 堆栈溢出致命错误
- java - Java中的OpenCV ptr
- laravel - 删除laravel eloquent中的第一条记录
- php - 如何从下面给出的 json 中显示 tld 值
- apache-kafka - 卡夫卡订户与消费者