在Go语言里完成加减乘除等基础计算,核心在于理解它的强类型机制和内置运算符。和动态语言不同,Go要求参与运算的双方类型一致,否则编译器会直接报错。下面先通过一张示意图建立直观印象。

基础运算符与整型计算
Go语言提供了标准的算术运算符:加号+、减号-、星号*、斜杠/以及取模%。对于整数类型,除法会直接截断小数部分,只保留商的整数部分,这一点和Python 3的行为不同,初学者很容易在这里写出不符合预期的逻辑。
下面的例子展示了两个int变量的基本运算。注意第三行整数除法得到的是2而不是2.5,如果希望得到浮点结果,必须先将操作数转换成float64再计算。
package main
import "fmt"
func main() {
var a int = 5
var b int = 2
fmt.Println(a + b) // 输出 7
fmt.Println(a - b) // 输出 3
fmt.Println(a * b) // 输出 10
fmt.Println(a / b) // 输出 2,整数除法截断
fmt.Println(a % b) // 输出 1,取模运算
var c float64 = float64(a) / float64(b)
fmt.Println(c) // 输出 2.5
}
取模运算符%只能用于整数,若对浮点数使用会编译失败。另外Go不支持运算符重载,因此不能给自定义结构体定义加号行为,只能调用方法。
浮点运算与类型转换
当业务涉及小数时,通常使用float64而非float32,因为前者精度更高且现代CPU处理效率并不差。浮点除法不会产生截断,但会带来精度误差,例如0.1加0.2在二进制下无法精确表示。
不同类型混合计算必须先显式转换,Go没有隐式数值转换。下面代码演示了int与float64相加的正确写法,以及错误写法被注释的原因。
package main
import "fmt"
func main() {
var x int = 10
var y float64 = 3.5
// 错误:fmt.Println(x + y) 类型不匹配
result := float64(x) + y
fmt.Println(result) // 输出 13.5
// 将浮点转回整数会丢弃小数
back := int(y)
fmt.Println(back) // 输出 3
}
显式转换让代码意图清晰,也避免了隐藏的精度丢失 bug。在金融计算场景中,建议用整数分单位存储金额,展示时再除,而不是依赖float64。
自增自减与简写赋值
Go将自增++和自减--设计为语句而非表达式,所以不能写成c = a++这种形式,只能单独成行。这减少了副作用带来的阅读负担,但也要求开发者调整习惯。
复合赋值如+=、-=、*=、/=可以简化运算并提升可读性。以下示例覆盖了这些写法:
package main
import "fmt"
func main() {
n := 1
n++
fmt.Println(n) // 输出 2
n--
fmt.Println(n) // 输出 1
sum := 10
sum += 5
fmt.Println(sum) // 输出 15
sum *= 2
fmt.Println(sum) // 输出 30
}
由于自增语句不能参与表达式,若需要返回新值只能手动写n+1。这种限制让并发场景下对变量的修改更易于追踪,配合Go的竞态检测工具能更快发现问题。
常见错误与最佳实践
新手常犯的错误是以为int和int64可以自动互通,或者在大数相乘时溢出却不察觉。Go的int长度随平台变化,32位系统上int是32位,64位系统上是64位,跨平台计算建议明确使用int64。
下面表格列出主要数值类型的运算特征,帮助选择合适的声明方式:
| 类型 | 除法行为 | 取模支持 | 建议场景 |
|---|---|---|---|
| int | 截断 | 是 | 通用计数 |
| int64 | 截断 | 是 | 大数、跨平台 |
| float64 | 保留小数 | 否 | 科学计算 |
写计算逻辑时,先确定数值范围和精度需求,再选择类型并统一转换入口。把转换集中在函数边界处,内部保持单一类型,能显著降低出错概率。