第三天:PHP 开发者快速掌握 Go 运算符与流程控制
作为PHP开发者,你早已熟悉if/else、for、foreach等流程控制语法,以及+/-/*/、==/===等运算符。Go的运算符和流程控制语法与PHP高度相似,但也有不少“细节差异”——比如Go只有for一种循环、if无需括号、switch默认不穿透。今天我们就以PHP语法为参照,快速掌握Go的运算符和流程控制核心逻辑。
一、Go运算符(对标PHP运算符)
Go的运算符体系与PHP基本一致,但在“比较运算符”“逻辑运算符”上有细节差异,我们按类别对标讲解:
1. 算术运算符(几乎与PHP一致)
| 运算符 | 说明 | Go示例 | PHP示例 |
|---|---|---|---|
| + | 加法/字符串拼接 | 10 + 5; "Go" + "PHP" | 10 + 5; "Go" . "PHP" |
| -/*///% | 减法/乘法/除法/取余 | 10 - 5; 10 * 5; 10 / 3; 10 % 3 | 10 - 5; 10 * 5; 10 / 3; 10 % 3 |
| ++/-- | 自增/自减 | i++; i--(仅后置,无前置赋值) | $i++; ++$i; $i--; --$i |
⚠️ 关键差异:
1. Go的字符串拼接用+,PHP用.;
2. Go的++/--是语句而非表达式,不能写j = i++,只能单独写i++;PHP则支持$j = $i++。
2. 比较运算符(比PHP更“严格”)
Go的比较运算符无隐式类型转换,对标PHP的===(严格相等),而非==(松散相等):
| Go比较运算符 | PHP对应写法 | 核心说明 |
|---|---|---|
| == | === | 类型+值都相等才返回true(无隐式转换) |
| != | !== | 类型或值不相等返回true |
| >/ | >/ | 仅同类型可比较,如int和string无法比较 |
// Go比较运算符(严格)
func main() {
a := 10
b := "10"
// fmt.Println(a == b) // 编译报错:类型不匹配,无法比较
fmt.Println(10 == 10) // true
}
PHP对应对比:
// PHP比较运算符(松散/严格) $a = 10; $b = "10"; echo $a == $b; // true(松散相等,隐式转换) echo $a === $b; // false(严格相等,类型不同)
3. 逻辑运算符(符号不同,逻辑一致)
| Go逻辑运算符 | PHP逻辑运算符 | 说明 |
|---|---|---|
| && | && / and | 逻辑与 |
| || | || / or | 逻辑或 |
| ! | ! / not | 逻辑非 |
示例(逻辑一致,仅符号写法统一):
// Go逻辑运算符
if age > 18 && score >= 60 {
fmt.Println("合格")
}
// PHP逻辑运算符
if ($age > 18 && $score >= 60) {
echo "合格";
}
二、Go流程控制(对标PHP的if/for/switch)
Go的流程控制语法更简洁、规范,核心特点:无括号(条件外)、有缩进约束,且只有for一种循环(替代PHP的for/foreach/while)。
1. 条件判断:if/else if/else(对标PHP)
Go的if语句无需括号包裹条件,且支持“条件初始化”,语法更灵活:
基础写法(对标PHP if)
// Go if/else if/else
func main() {
score := 85
// 无需括号,缩进为强制规范(PHP无强制缩进)
if score >= 90 {
fmt.Println("优秀")
} else if score >= 70 {
fmt.Println("良好")
} else {
fmt.Println("及格")
}
}
PHP对应写法:
// PHP if/else if/else
$score = 85;
if ($score >= 90) {
echo "优秀";
} else if ($score >= 70) {
echo "良好";
} else {
echo "及格";
}
进阶:if条件初始化(Go独有)
Go允许在if前初始化变量,变量仅在if代码块内有效,简化代码:
// Go if条件初始化
func main() {
// 先计算score,再判断,score仅在if块内有效
if score := 95; score >= 90 {
fmt.Println("优秀,分数:", score)
}
// fmt.Println(score) // 编译报错:score未定义
}
PHP需提前定义变量:
// PHP 等效写法
$score = 95;
if ($score >= 90) {
echo "优秀,分数:" . $score;
}
2. 循环:for(替代PHP的for/foreach/while)
Go没有while、do-while、foreach,仅用for实现所有循环逻辑,是Go循环的核心。
方式1:普通for循环(对标PHP for)
// Go普通for循环(初始化; 条件; 自增)
func main() {
// 对标PHP:for ($i=0; $i<5; $i++)
for i := 0; i < 5; i++ {
fmt.Println(i) // 输出0-4
}
}
PHP对应写法:
// PHP普通for循环
for ($i=0; $i<5; $i++) {
echo $i . "\n"; // 输出0-4
}
方式2:for range(对标PHP foreach)
遍历数组/切片/map时,用for range替代PHP的foreach,支持获取“索引+值”或仅“值”:
// Go for range遍历切片(对标PHP foreach索引数组)
func main() {
fruits := []string{"苹果", "香蕉", "橙子"}
// 索引i,值fruit(类似PHP:foreach($fruits as $i => $fruit))
for i, fruit := range fruits {
fmt.Printf("索引:%d,水果:%s\n", i, fruit)
}
// 仅取值(忽略索引,用_占位)
for _, fruit := range fruits {
fmt.Println(fruit)
}
}
PHP对应写法:
// PHP foreach遍历索引数组
$fruits = ["苹果", "香蕉", "橙子"];
foreach ($fruits as $i => $fruit) {
echo "索引:{$i},水果:{$fruit}\n";
}
// 仅取值
foreach ($fruits as $fruit) {
echo $fruit . "\n";
}
方式3:无限循环(对标PHP while(true))
// Go无限循环(对标PHP while(true))
func main() {
count := 0
// 无条件的for = 无限循环
for {
count++
if count >= 3 {
break // 退出循环,对标PHP break
}
fmt.Println("循环中...")
}
}
PHP对应写法:
// PHP无限循环
$count = 0;
while (true) {
$count++;
if ($count >= 3) {
break;
}
echo "循环中...\n";
}
3. 分支选择:switch(比PHP更灵活)
Go的switch默认不穿透(无需手动break),且支持任意类型条件、多个case值,比PHP的switch更易用:
// Go switch基本用法
func main() {
day := 3
switch day {
case 1, 2, 3, 4, 5: // 多个case值,用逗号分隔
fmt.Println("工作日")
case 6, 7:
fmt.Println("周末")
default: // 对标PHP default
fmt.Println("无效日期")
}
}
💡 核心优势:Go的switch默认执行完case后自动退出,无需写break;若需穿透,加fallthrough关键字(类似PHP不写break)。
PHP对应写法(需手动break):
// PHP switch
$day = 3;
switch ($day) {
case 1:
case 2:
case 3:
case 4:
case 5:
echo "工作日";
break; // 必须写break,否则穿透
case 6:
case 7:
echo "周末";
break;
default:
echo "无效日期";
}
三、实战案例:PHP vs Go 流程控制对比
需求:遍历数组,筛选出大于60的分数并输出
PHP写法
$scores = [85, 58, 92, 70, 55];
$passScores = [];
foreach ($scores as $score) {
if ($score > 60) {
$passScores[] = $score;
}
}
echo "及格分数:" . implode(",", $passScores); // 输出85,92,70
Go写法
package main
import "fmt"
func main() {
scores := []int{85, 58, 92, 70, 55}
var passScores []int // 声明切片,对标PHP数组
for _, score := range scores {
if score > 60 {
passScores = append(passScores, score) // 追加元素,对标PHP $arr[]=值
}
}
fmt.Print("及格分数:")
for i, s := range passScores {
if i > 0 {
fmt.Print(",")
}
fmt.Print(s)
}
}
五、今日小结
今天我们以PHP运算符和流程控制为参照,掌握了Go的核心语法:
- Go运算符与PHP基本一致,但字符串拼接用
+、++/--仅能后置、比较运算符无隐式转换; - Go的if无需括号,支持条件初始化;
- Go仅用
for实现所有循环,for range对标PHP的foreach; - Go的switch默认不穿透,支持多case值,比PHP更灵活。
明天我们将学习Go的函数(对标PHP函数/方法),包括函数声明、参数、返回值、匿名函数等核心知识点,继续用PHP思维快速上手。
