Go语言运算符与控制结构全解:从语法到实战
掌握Go语言的基础是理解其运算符与控制结构。本文详细梳理了算术、关系、逻辑、位、赋值及指针运算符的用法与优先级,并深入解析If判断、For循环(含Range遍历)和Switch多路分发的核心语法与常见陷阱,帮助开发者编写更健壮、地道的Go代码。
运算符详解
运算符用于将操作数组合成表达式。在Go中,基本的表达式构建如:n := i + j。Go主要包含六种运算符类别。
算术运算符
| 运算符 | 含义 |
|---|---|
+ | 加法;整数、浮点数、复数相加,或字符串拼接 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 求余;仅适用于整数类型 |
++ | 自增(后自增/前自增不可作为独立语句使用) |
-- | 自减(同上,Go不支持单独的--运算作为语句,需配合变量修改) |
+/- | 一元正/负号 |
注意事项:
1. % 仅支持整数,对浮点数使用会报错。
2. Go中的 i++ 和 ++i 是语句而非表达式,不能像C系列语言那样直接赋值给其他变量(如 j = i++ 是非法的)。
// 字符串拼接
str := "hello" + "world"
// 自增只能单独使用
var n int = 1
n++
关系运算符
结果为布尔值,常用于控制结构的条件判断:
| 运算符 | 含义 |
|---|---|
== | 相等 |
!= | 不相等 |
< | 小于 |
> | 大于 |
<= | 小于或等于 |
>= | 大于或等于 |
逻辑运算符
同样返回布尔值,支持短路求值:
| 运算符 | 含义 |
|---|---|
&& | 逻辑与(AND) |
|| | 逻辑或(OR) |
! | 逻辑非(NOT),优先级最高之一 |
位运算符
仅适用于整数类型。Go提供了按位操作特有的按位清空运算符 &^。
| 运算符 | 含义 |
|---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
<< | 左移 |
>> | 右移 |
&^ | 按位清空(Mask Clear):若右边为1,则左边对应位清零 |
fmt.Println(2 & 1) // 0 (0010 & 0001)
fmt.Println(2 | 1) // 3 (0010 | 0001)
fmt.Println(2 ^ 1) // 3 (0010 ^ 0001)
fmt.Println(1 << 1) // 2 (0001 << 1)
fmt.Println(2 >> 1) // 1 (0010 >> 1)
fmt.Println(23 &^ 5) // 18 (00010111 &^ 00000101 = 00010010)
赋值运算符
包括基础赋值 = 和声明赋值 :=,以及复合赋值(如 +=, -=, <<= 等)。注意 != 是关系运算符,不是赋值运算符,表格中原稿有误,此处已修正。!= 表示不等于。
指针运算符
| 运算符 | 含义 |
|---|---|
& | 取地址 |
* | 解引用(指向的内容) |
运算符优先级
当混合使用时,了解优先级至关重要。优先级从高到低:
- 最高:一元运算符
+,-,!,*(指针),&(取址) - Level 5:
*,/,%,<<,>>,&,&^ - Level 4:
+,-,|,^ - Level 3:
==,!=,<,>,<=,>= - Level 2:
&& - Level 1:
|| - 最低:所有赋值运算符 (
=,+=, etc.)
注: ++ 和 -- 是语句,不参与表达式优先级计算。
控制结构详解
Go语言的控制结构相对简洁,主要包括 if、for 和 switch。
If 条件判断
if 的基本结构如下,条件表达式无需括号,但代码块必须使用花括号:
if condition {
// code
}
带初始化语句的 If:可以在条件检查前先执行初始化代码,该变量的作用域仅限于 if-else 块内:
if err := doSomething(); err != nil {
fmt.Println("Error:", err)
}
Else/Else If 链:
if x > 10 {
fmt.Println("Big")
} else if x == 10 {
fmt.Println("Equal")
} else {
fmt.Println("Small")
}
For 循环
Go只有 for 一种循环关键字,它取代了其他语言中的 while 和 do-while。
第1步:经典三要素循环
包含初始化、条件和后置语句:
for init; condition; post {
// loop body
}
// 示例
for i := 0; i < 10; i++ {
fmt.Println(i)
}
第2步:简化版 While 循环
省略初始化与后置语句,仅保留条件:
x := 1
for x < 20 {
fmt.Println(x)
x++
}
第3步:死循环
省略条件:
for {
// infinite loop
break // use break to exit
}
第4步:Range 遍历
用于遍历数组、切片、Map、String 和 Channel。类似 PHP 的 foreach:
a := []int{1, 2, 3}
for index, value := range a {
fmt.Printf("Index: %d, Value: %d\n", index, value)
}
循环控制:
break:立即退出当前循环或 switch。continue:跳过本次迭代,进入下一次。
Switch 多路分支
Go的 switch 非常强大且灵活,默认情况下每个 case 自动带有 break,除非使用 fallthrough。
第1步:标准 Switch
比较 switch 后的表达式与 case 后的值:
x := 8
switch x {
case 8:
fmt.Println("Eight")
case 9:
fmt.Println("Nine")
default:
fmt.Println("Unknown")
}
第2步:Fallthrough 穿透
如果希望在匹配一个 case 后继续执行下一个 case,使用 fallthrough:
switch x {
case 8:
fmt.Println("Eight")
fallthrough
case 9:
fmt.Println("Nine")
fallthrough
case 10:
fmt.Println("Ten")
}
上述代码将依次输出 Eight, Nine, Ten。
第3步:无标签 Switch (类似 If/Else If)
省略 switch 后的表达式,直接在 case 中写条件:
x := 10
switch {
case x >= 10:
fmt.Println("At least 10")
case x > 20:
fmt.Println("Greater than 20")
default:
fmt.Println("Unknown")
}
第4步:带初始化的 Switch
同样支持局部变量初始化:
switch v := compute(); {
case v > 0:
fmt.Println("Positive")
case v < 0:
fmt.Println("Negative")
default:
fmt.Println("Zero")
}
总结
Go语言的运算符设计注重清晰与安全,特别是自增自减的限制避免了复杂的表达式副作用。控制结构方面,for 的一体化设计和 switch 的自动 break 机制使得代码更加紧凑易读。理解这些基础结构是编写高效 Go 程序的关键。
以上就是Go语言运算符与控制结构详解的详细内容,更多关于Go语言基础语法与进阶操作的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













