为何从终端读取输入后fmt.Print无法正常工作?
fmt.Print在终端输入场景无输出的原因及解决方法
问题场景
编写BMI计算器时,读取用户输入的体重(Kg)和身高(m)后,尝试用fmt.Print将二者无间隔拼接输出,出现以下异常:
- 终端输入场景下,
fmt.Print无任何输出 - 改用
fmt.Println可正常分行输出 - 硬编码字符串时,
fmt.Print能正常拼接输出
终端输入版代码:
package main import ( "bufio" "fmt" "os" "strings" ) var reader = bufio.NewReader(os.Stdin) func main() { fmt.Println("BMI Calculator") fmt.Print("Please enter your weight (Kg): ") weightInput, _ := reader.ReadString('\n') fmt.Print("Please enter your height (m): ") heightInput, _ := reader.ReadString('\n') weightInput = strings.Replace(weightInput, "\n", "", -1) heightInput = strings.Replace(heightInput, "\n", "", -1) fmt.Print(weightInput) fmt.Print(heightInput) }
硬编码测试代码:
package main import ( "fmt" "strings" ) func main() { fmt.Println("BMI Calculator") weightInput := "70" heightInput := "1.8" weightInput = strings.Replace(weightInput, "\n", "", -1) heightInput = strings.Replace(heightInput, "\n", "", -1) fmt.Print(weightInput) fmt.Print(heightInput) }
原因分析
核心问题是标准输出的行缓冲机制:
- 终端环境下,标准输出默认采用行缓冲模式,只有当输出内容包含换行符
\n,或缓冲区被手动刷新、程序退出时,缓冲区内容才会被输出到终端。 fmt.Print不会自动添加换行符,输出内容停留在缓冲区中未被刷出,因此看不到输出。fmt.Println会自动追加换行符,触发缓冲区刷新,所以能正常输出。- 硬编码场景下程序执行速度快,退出时系统会自动刷新标准输出缓冲区,因此能看到
fmt.Print的内容。
解决方法
有两种可靠的解决方式:
方法1:添加换行符触发刷新
在拼接输出后添加换行符,直接触发行缓冲刷新:
// 替换原最后两行 fmt.Print(weightInput, heightInput, "\n")
方法2:手动强制刷新缓冲区
导入os包后,调用os.Stdout.Sync()强制刷新缓冲区,无需添加换行:
// 在原最后两行后添加刷新操作 fmt.Print(weightInput) fmt.Print(heightInput) os.Stdout.Sync() // 强制刷新缓冲区
修改后的完整终端输入版代码(以方法2为例):
package main import ( "bufio" "fmt" "os" "strings" ) var reader = bufio.NewReader(os.Stdin) func main() { fmt.Println("BMI Calculator") fmt.Print("Please enter your weight (Kg): ") weightInput, _ := reader.ReadString('\n') fmt.Print("Please enter your height (m): ") heightInput, _ := reader.ReadString('\n') weightInput = strings.Replace(weightInput, "\n", "", -1) heightInput = strings.Replace(heightInput, "\n", "", -1) fmt.Print(weightInput) fmt.Print(heightInput) os.Stdout.Sync() // 手动刷新缓冲区 }
内容的提问来源于stack exchange,提问作者NithishB
相关产品推荐
相关产品推荐

