赋值运算符 #
一、运算符概述 #
Go语言支持以下赋值运算符:
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 赋值 | a = b |
| += | 加后赋值 | a += b |
| -= | 减后赋值 | a -= b |
| *= | 乘后赋值 | a *= b |
| /= | 除后赋值 | a /= b |
| %= | 取余后赋值 | a %= b |
| &= | 按位与后赋值 | a &= b |
| |= | 按位或后赋值 | a |= b |
| ^= | 按位异或后赋值 | a ^= b |
| <<= | 左移后赋值 | a <<= n |
| >>= | 右移后赋值 | a >>= n |
二、基本赋值 #
2.1 单变量赋值 #
go
var a int
a = 10
b := 20 // 短声明赋值
2.2 多变量赋值 #
go
var a, b int
a, b = 1, 2
x, y := 10, 20
2.3 交换变量 #
go
a, b := 1, 2
a, b = b, a
fmt.Println(a, b) // 2 1
2.4 函数返回多值 #
go
func divmod(a, b int) (int, int) {
return a / b, a % b
}
quotient, remainder := divmod(10, 3)
fmt.Println(quotient, remainder) // 3 1
三、复合赋值运算符 #
3.1 算术复合赋值 #
go
a := 10
a += 5 // a = a + 5 → 15
a -= 3 // a = a - 3 → 12
a *= 2 // a = a * 2 → 24
a /= 4 // a = a / 4 → 6
a %= 4 // a = a % 4 → 2
3.2 位运算复合赋值 #
go
a := 12 // 1100
a &= 10 // a = a & 10 → 8 (1000)
a |= 3 // a = a | 3 → 11 (1011)
a ^= 6 // a = a ^ 6 → 13 (1101)
a <<= 2 // a = a << 2 → 52 (110100)
a >>= 1 // a = a >> 1 → 26 (11010)
3.3 清除位复合赋值 #
go
a := 15 // 1111
a &^= 6 // 清除 110 位 → 9 (1001)
四、赋值表达式 #
4.1 赋值是语句 #
Go中赋值是语句,不是表达式:
go
a := 10
// 错误:赋值不能作为表达式
if a = 20; a > 0 { // 这是合法的,但不是赋值表达式
fmt.Println(a)
}
// 错误
b := a = 30 // 编译错误
4.2 自增自减 #
Go的自增自减是语句:
go
a := 10
a++ // 正确
a-- // 正确
// 错误
b := a++ // 编译错误
五、实际应用 #
5.1 累加器 #
go
sum := 0
for i := 1; i <= 10; i++ {
sum += i
}
fmt.Println(sum) // 55
5.2 字符串拼接 #
go
result := ""
for i := 0; i < 5; i++ {
result += fmt.Sprintf("%d ", i)
}
fmt.Println(result) // 0 1 2 3 4
// 更高效的方式
var builder strings.Builder
for i := 0; i < 5; i++ {
builder.WriteString(fmt.Sprintf("%d ", i))
}
fmt.Println(builder.String())
5.3 权限管理 #
go
const (
Read = 1 << iota // 1
Write // 2
Execute // 4
)
perm := 0
perm |= Read // 添加读权限
perm |= Write // 添加写权限
perm &^= Write // 移除写权限
5.4 计数器 #
go
count := 0
count += 1
count += 1
fmt.Println(count) // 2
六、多变量赋值应用 #
6.1 交换值 #
go
a, b := 1, 2
a, b = b, a
6.2 函数返回值 #
go
func getUser() (string, int) {
return "Tom", 25
}
name, age := getUser()
6.3 忽略返回值 #
go
func divmod(a, b int) (int, int) {
return a / b, a % b
}
quotient, _ := divmod(10, 3) // 忽略余数
6.4 错误处理 #
go
data, err := readFile("test.txt")
if err != nil {
return err
}
七、常见错误 #
7.1 类型不匹配 #
go
var a int = 10
var b int32 = 20
a = b // 错误:类型不匹配
a = int(b) // 正确
7.2 未声明变量 #
go
a = 10 // 错误:a未声明
var a int
a = 10 // 正确
7.3 短声明重复 #
go
a := 10
a := 20 // 错误:a已声明
a = 20 // 正确:赋值
7.4 赋值表达式 #
go
// 错误:Go不支持赋值表达式
if err = doSomething(); err != nil {
// 这是合法的,但不是赋值表达式
}
八、最佳实践 #
8.1 使用有意义的变量名 #
go
totalPrice := 0
for _, item := range items {
totalPrice += item.Price
}
8.2 避免链式赋值 #
go
// 不推荐
a, b, c = 1, 1, 1
// 推荐
a = 1
b = 1
c = 1
// 或者
a, b, c = 1, 1, 1 // 如果确实相同
8.3 及时处理错误 #
go
data, err := readFile("test.txt")
if err != nil {
return err
}
// 使用data
九、总结 #
赋值运算符要点:
| 运算符 | 说明 | 等价形式 |
|---|---|---|
| = | 赋值 | a = b |
| += | 加后赋值 | a = a + b |
| -= | 减后赋值 | a = a - b |
| *= | 乘后赋值 | a = a * b |
| /= | 除后赋值 | a = a / b |
| %= | 取余后赋值 | a = a % b |
| &= | 按位与后赋值 | a = a & b |
| |= | 按位或后赋值 | a = a | b |
| ^= | 按位异或后赋值 | a = a ^ b |
| <<= | 左移后赋值 | a = a << n |
| >>= | 右移后赋值 | a = a >> n |
关键点:
- 赋值是语句:不是表达式
- 多变量赋值:支持同时赋值多个变量
- 复合赋值:简化运算和赋值操作
- 类型匹配:赋值时类型必须匹配
准备好学习运算符优先级了吗?让我们进入下一章!
最后更新:2026-03-26