You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何从终端读取输入后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:25:53