如何使用Golang实现基础计算器程序_Golang函数与错误处理实践
技术百科
P粉602998670
发布时间:2026-01-27
浏览: 次 应使用 strconv.ParseFloat 解析用户输入的浮点数并校验 error,配合 strings.TrimSpace 去除空白;四则运算需封装为返回 (float64, error) 的函数,显式检查除零、NaN、Inf;用 switch 处理运算符,bufio.Scanner 替代 fmt.Scanln 保证交互健壮。
用 strconv.ParseFloat 解析用户输入的数字,别直接用 fmt.Scanf 读浮点数
Go 的 fmt.Scanf 对浮点数输入容错极差,遇到空格、换行或非法字符会静默失败或阻塞。真实场景中用户可能输 "12.5 " 或 "-3.14abc",必须显式校验。
- 始终用
strconv.ParseFloat(input, 64)转换,并检查返回的error - 用
strings.TrimSpace去首尾空白,避免" 42 "导致解析失败 - 设置合理精度(如
64)——32在计算0.1 + 0.2时误差更大
把四则运算封装成带错误返回的函数,比如 func add(a, b float64) (float64, error)
看似简单的加减乘除,在计算器里必须考虑边界:除零、溢出、NaN 传播。Go 不支持异常,所有异常路径都得走 error 返回。
-
divide函数必须显式判断b == 0,返回自定义错误如errors.New("division by zero") - 乘法和加法虽不直接 panic,但若输入是
+Inf或NaN,结果不可控,建议在运算前用math.IsNaN和math.IsInf过滤 - 不要在函数内
log.Fatal或panic——调用方应决定如何处理错误(重试?提示?退出?)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
result := a / b
if math.IsNaN(result) || math.IsInf(result, 0) {
return 0, errors.New("invalid arithmetic result")
}
return result, nil
}
用 switch 处理运算符字符串,别写一堆 if/else if
用户输入的运算符是字符串(如 "+", "*"),用 switch 不仅可读性高,还能天然防大小写混淆和多余空格问题。
- 先用
strings.TrimSpace清理运算符输入,再switch op - 每个
case调用对应运算函数并检查错误,不要把错误处理逻辑分散到各处 - 必须有
default分支返回明确错误,比如"unsupported operator: " + op,否则非法符号会静默失败
主循环里用 bufio.Scanner 替代 fmt.Scanln,避免换行残留干扰
fmt.Scanln 读完一行后,如果输入缓冲区还有未消费的换行符,下一次读取可能立即返回空字符串。交互式计算器连续输入时极易卡死或跳过输入。
- 用
bufio.NewScanner(os.Stdin),它按行读取且自动丢弃换行符 - 每次调用
scanner.Scan()后,用scanner.Text()获取干净字符串 - 注意检查
scanner.Err()——例如用户按 Ctrl+D(EOF)时需优雅退出,而不是 panic

真正难的不是算加减法,是让程序在用户随手乱输、反复回退、中间 Ctrl+C 的情况下,依然能给出明确反馈、不崩溃、不卡住。每一步输入解析和每一步运算都要假设它会失败——Go 的错误处理不是装饰,是运行时的呼吸节奏。
# 要把
# 还能
# 都要
# 自定义
# 更大
# default
# input
# go
# golang
# 循环
# Error
# 堆
# if
# 字符串
# operator
# 封装
# switch
# 运算符
# EOF
# 换行
# 加减乘除
# 浮点数
# math
# 换行符
# golang函数
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- PowerShell怎么创建复杂的XML结构
- Windows10系统怎么查看显卡型号_Win10
- c++怎么操作redis数据库_c++ hired
- Windows10如何更改鼠标图标_Win10鼠标
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- Win11怎么关闭资讯和兴趣_Windows11任
- 如何高效识别并拦截拼接式恶意域名 spam
- Windows电脑如何截屏?(四种快捷方法)
- 如何正确访问 Laravel 模型或对象的属性而非
- Mac版Final Cut Pro入门_Mac视频
- Win10怎样安装Word样式库_Win10安装W
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Win11怎么开启自动HDR画质_Windows1
- Win11开机速度慢怎么优化_Win11系统启动加
- 零基础学会Python自动化办公_高效处理Exce
- Win10 BitLocker加密教程 Win10
- php下载安装后memory_limit怎么设置_
- Windows10无法识别USB设备描述符请求失败
- Python网络超时处理_健壮性设计说明【指导】
- Python对象生命周期管理_创建销毁解析【教程】
- Win11怎样安装网易云音乐_Win11安装网易云
- 如何使用Golang实现错误包装与传递_Golan
- Win11无法拖拽文件到任务栏怎么办_Win11开
- php怎么下载安装后设置错误日志_phpini l
- Win11怎么关闭小组件_Win11禁用任务栏天气
- Windows 11无法安全删除U盘提示设备正在使
- 如何使用Golang实现RPC序列化与反序列化_G
- Win11怎样安装剪映专业版_Win11安装剪映教
- Win11怎么设置右键刷新选项_Windows11
- php485函数怎么捕获异常_php485错误处理
- c++怎么使用std::unique实现去重_c+
- Go语言中正确反序列化多个同级XML元素为结构体切
- Windows10电脑怎么设置文件权限_Win10
- Python网络异常模拟_测试说明【指导】
- Go 中的 := 运算符:类型推导机制与使用边界详
- php打包exe后无法读取环境变量_变量配置方法【
- 如何在同包不同文件中正确引用 Go 结构体
- Windows笔记本无法进入睡眠模式怎么办?(电源
- Win11怎么设置声音输出设备_Windows11
- c++怎么处理多线程死锁_c++ lock_gua
- PHP 中如何在函数内持久化修改引用变量的指向
- 如何使用Golang实现函数指针_函数变量与回调示
- Windows10电脑怎么连接蓝牙设备_Win10
- LINUX怎么设置系统语言_LINUX修改中文环境
- Win10如何更改开机密码_Windows10登录
- Win11怎么更改系统语言为中文_Windows1
- Win11笔记本怎么看电池健康度_Win11电池报
- Django 密码修改后会话失效的解决方案
- 如何更改Windows资源管理器的默认启动位置?(
- Win10如何卸载自带Edge_Win10彻底卸载

QQ客服