接上篇:php程序员学go语言(一)-CSDN博客
一、go函数
1、示例:基础函数
// 1. 包声明:main包 = 程序入口(必须)package main// 2. 导入包:fmt = 格式化输出(对应PHP echo/print)import "fmt"// 3. 主函数:main() = 程序入口(必须,无参数无返回值)funcmain() { res := addNum(8, 12) fmt.Println(res) // 20}// 函数语法:func 函数名(参数 类型) 返回值类型 { ... }funcaddNum(a int, b int) int { return a + b}
2、多返回值
// 1. 包声明:main包 = 程序入口(必须)package main// 2. 导入包:fmt = 格式化输出(对应PHP echo/print)import "fmt"// 3. 主函数:main() = 程序入口(必须,无参数无返回值)funcmain() { // 一次性接收 3 个返回值 sum, sub, mul := mathCalc(20, 5) fmt.Println("和:", sum) // 25 fmt.Println("差:", sub) // 15 fmt.Println("积:", mul) // 100}// 多返回值:和、差、积funcmathCalc(a int, b int) (int, int, int) { return a + b, a - b, a * b}
类似于PHP的
// PHP 一次接收多个返回值list($sum, $sub, $mul) = mathCalc(20, 5);echo "和:".$sum; // 25echo "差:".$sub; // 15echo "积:".$mul; // 100// 返回 数组 = 模拟 Go 多返回值functionmathCalc($a, $b) { return [ $a + $b, // 第1个值:和 $a - $b, // 第2个值:差 $a * $b // 第3个值:积 ];}
二、流程控制
1、if判断
// 1. 包声明:main包 = 程序入口(必须)package main// 2. 导入包:fmt = 格式化输出(对应PHP echo/print)import "fmt"// 3. 主函数:main() = 程序入口(必须,无参数无返回值)funcmain() { age := 18 if age >= 18 { fmt.Println("成年") } else { fmt.Println("未成年") }}
2、for 循环(Go 只有 for,替代 PHP 的 for/while/do-while)
// 1. 包声明:main包 = 程序入口(必须)package main// 2. 导入包:fmt = 格式化输出(对应PHP echo/print)import "fmt"// 3. 主函数:main() = 程序入口(必须,无参数无返回值)funcmain() { // 1. 标准for(对应PHP for) for i := 0; i < 3; i++ { fmt.Println(i) } // 2. 遍历切片(对应PHP foreach) //nums:变量名 //:=:Go 定义变量 + 赋值(自动推导类型) //[]int:int 类型的切片 / 数组 //{1,2,3}:里面放元素 nums := []int{1,2,3} //相当于 PHP 的:user = new User();$user->Name = "沈万三";$user->Age = 30;) user := User{Name: "沈万三", Age: 30} // 调用方法(相当于PHP this//u是自定义的名称,Go 社区习惯:用类型的首字母当接收者名字,你可以可以命名为this或self都可以func(u User) SayHi() { fmt.Printf("我是%s,今年%d岁\n", u.Name, u.Age)}
四、错误处理(Go 无 try-catch)
PHP 用 try-catch 抛异常,Go用返回值处理错误(简洁、强制处理):
Go 没有 try/catch, 所以所有函数必须把「错误」当成一个返回值传出来
// 1. 包声明:main包 = 程序入口(必须)package main// 2. 导入包:fmt = 格式化输出(对应PHP echo/print)import "fmt"import "os"// 3. 主函数:main() = 程序入口(必须,无参数无返回值)funcmain() { // 标准错误处理写法 file, err := os.Open("test.txt") //nil是Go 里的「空 / 无 / 什么都没有」不等于空就是有错误 if err != nil { fmt.Println("文件打开失败:", err) return } //defer 相当于PHP finally 不管函数从哪退出,最后一定执行! defer file.Close() // 延迟关闭,确保不管怎么退出函数,这句一定会执行}
五、并发(Go 最大优势!原生支持)
PHP-FPM 是多进程同步阻塞模型,靠多进程 / 多实例实现并发;Go 原生支持协程(goroutine),轻量到可以开上万协程。
package mainimport ( "fmt" "time")// 协程函数functask(name string) { for i := 0; i < 3; i++ { fmt.Printf("%s 执行中...\n", name) time.Sleep(1 * time.Second)// 暂停1秒 }}funcmain() { //开启协程:go 函数() 相当于让这个函数后台同时跑 **,不耽误主程序继续走!** //实际场景可以做:同时读 10 个文件,同时发 100 个请求,同时处理 1000 个用户请求 go task("协程1") // 后台跑 task,不阻塞主线程,协程1和协程2 谁先跑不一定,并发执行 go task("协程2") // 后台跑 task,不阻塞主线程,协程1和协程2 谁先跑不一定,并发执行 // 等待协程执行 (必须等一下!因为主程序不等协程,你不等它,它直接结束,协程会被杀死) //单个协程执行完需要 3 秒,主程序等待 4 秒(留 1 秒余量),保证协程一定执行完毕 //真实项目会使用WaitGroup(等待组),它的作用:等所有协程跑完,我再结束! time.Sleep(4 * time.Second) fmt.Println("主程序结束")}
五、Go 编译运行(对比 PHP)
PHP 是脚本语言,直接 php xxx.php 运行;
Go 是编译型语言,可以编译成二进制文件(无依赖,直接在服务器运行,不用装环境):
# 1. 直接运行(开发用)go run main.go# 2. 编译成可执行文件(生产用)go build main.go# 3. 运行编译后的文件(Windows: main.exe Linux/Mac: ./main)./main
编译出来的 main 可执行文件,拿到另一台没有go环境的的电脑上,一样能跑;它和你电脑上的qq、游戏等软件一样,都是操作系统原生可执行程序;
这就是 Go 最牛的地方:跨平台、编译即运行、无任何环境依赖!爽不爽?😎
六、总结:PHP 程序员必知与Go 的核心差异
- 类型系统:PHP 弱类型 → Go 强类型(编译时检查错误,更安全)
- 面向对象:PHP 类 / 继承 → Go 结构体 / 组合(无继承,更简洁)
- 函数:PHP 单返回值 → Go 多返回值(代码更优雅)
- 错误处理:PHP try-catch → Go 返回值处理(强制错误处理)
- 并发:PHP 传统 FPM无原生协程 → Go 原生 goroutine(高并发神器)
- 部署:PHP 需要 Nginx+PHP-FPM → Go 编译成二进制,直接运行
- 依赖:PHP composer(需单独安装)→ Go mod(Go 语言内置,无需单独安装)