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

Go代码输出异常求助:输入交互与格式化输出错误

Go语言输入交互混乱与格式化输出错误排查与修复

问题原因分析

  • 变量类型错误:姓名name1、name2被定义为int类型,但姓名是字符串,用fmt.Scan(&name1)读取字符串时会触发解析失败,导致后续输入提示直接批量输出,引发交互混乱。
  • 整数除法丢失精度:(age1 + age2) / 2是整数除法,哪怕后续转成float32,也会丢失小数部分(比如19+20=39,整数除法结果为19,转成浮点后仍是19.0,而非预期的19.5)。
  • 格式化输出双重错误:
    • 传递了变量地址(&name1、&average等)而非变量本身,导致输出内存地址。
    • 格式化符号不匹配:姓名用了整数符号%d,应该用字符串符号%s;平均年龄的符号也未匹配需求的小数显示。

修复后的代码

package main

import "fmt"

func main() {
    // 修正姓名变量类型为字符串
    var name1, name2 string
    var age1, age2 int
    var average float32

    fmt.Println("First person info:")
    fmt.Print("Name: ")
    // 用Scanln处理换行,避免输入缓冲区问题
    fmt.Scanln(&name1)
    fmt.Print("Age: ")
    fmt.Scanln(&age1)

    fmt.Println("Second person info:")
    fmt.Print("Name: ")
    fmt.Scanln(&name2)
    fmt.Print("Age: ")
    fmt.Scanln(&age2)

    // 先转浮点再除法,保留小数精度
    average = float32(age1+age2) / 2.0
    // 用正确的格式化符号,传递变量本身,匹配示例的小数位数
    fmt.Printf("\nThe average age of %s and %s is %.1f years\n", name1, name2, average)
}

关键修复说明

  1. 变量类型修正:将姓名变量改为string,确保能正确读取姓名内容。
  2. 输入方法调整:用fmt.Scanln替代fmt.Scan,确保每次输入后处理换行,避免输入缓冲区残留导致的交互混乱。
  3. 计算逻辑优化:先将年龄和转为浮点型再做除法,避免整数除法丢失小数部分。
  4. 格式化输出修正:使用对应类型的格式化符号,直接传递变量而非地址,同时设置小数位数匹配示例输出。

内容的提问来源于stack exchange,提问作者apuglia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:15:30