第三天:PHP 开发者快速掌握 Go 运算符与流程控制

yvsm5个月前Go语言5550

作为PHP开发者,你早已熟悉if/elseforforeach等流程控制语法,以及+/-/*/==/===等运算符。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没有whiledo-whileforeach,仅用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的核心语法:

  1. Go运算符与PHP基本一致,但字符串拼接用+++/--仅能后置、比较运算符无隐式转换;
  2. Go的if无需括号,支持条件初始化;
  3. Go仅用for实现所有循环,for range对标PHP的foreach
  4. Go的switch默认不穿透,支持多case值,比PHP更灵活。

明天我们将学习Go的函数(对标PHP函数/方法),包括函数声明、参数、返回值、匿名函数等核心知识点,继续用PHP思维快速上手。

标签: PHP转Go

相关文章

第四天:PHP 开发者快速掌握 Go 函数

作为PHP开发者,你早已熟悉function定义函数、参数传值/传引用、return返回结果的逻辑。Go的函数体系更严谨、功能更丰富——支持多返回值、命名返回值、可变参数,且函数本身可作为参数/返回值...

第八天:PHP开发者快速掌握Go并发编程 | Goroutine与Channel从入门到实战

作为PHP开发者,你知道实现并发需要依赖pcntl扩展创建多进程、pthreads扩展实现多线程,或借助Swoole/Workerman框架——步骤繁琐且资源消耗高。而Go内置原生并发支持:Gorou...

第七天:PHP开发者快速掌握Go错误处理与文件操作 | 从PHP异常/文件函数到Go实战

作为PHP开发者,你熟悉用try/catch处理异常、file_get_contents/file_put_contents读写文件、mkdir创建目录。Go没有“异常(Exception)”的概念,...

第一天:从PHP到Golang,零基础入门的环境搭建与第一个程序

作为一名PHP开发者,当你决定接触Golang(简称Go)时,首先会好奇它和熟悉的PHP有哪些差异,以及如何快速迈出第一步。今天我们就从环境搭建和第一个Go程序入手,用PHP开发者熟悉的思维来解锁Go...

第六天:PHP开发者快速掌握Go结构体与接口 | 从PHP类/接口到Go面向对象

作为PHP开发者,你熟悉用class定义类、interface定义接口,通过实例化对象实现面向对象编程。Go没有“类(class)”的概念,但通过结构体(struct)实现类的属性封装,通过方法(me...

第二天:PHP 开发者快速掌握 Go 变量与数据类型

作为PHP开发者,你早已习惯了“无需声明类型、变量随用随定义”的弱类型特性,而Go作为强类型语言,变量必须显式声明类型(或通过推导确定)。今天我们就以PHP的变量/数据类型为参照,快速掌握Go的变量声...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。