php程序员如何转go,写给 PHP 程序员的 Go 入门教程
這兩年唱衰 PHP 的論調不少(其實我覺得大可不必),導致不少 PHP 程序員產生危機感,紛紛尋求轉型,根據我的觀察,基本上 Go 都是首選。不管怎么說,技多不壓身,多掌握一點知識總是好的。本文就作為一個基礎的入門來幫助 PHP 程序員入門 Go 語言吧。
1. 腳本語言 vs 編譯型語言
這其實是個我每次面試都會問的問題,腳本語言和編譯型語言有什么區別。維基上的解釋:語法和結構通常比較簡單
學習和使用通常比較簡單
通常以容易修改程序的“解釋”作為運行方式,而不需要“編譯”
程序的開發產能優于運行性能
從我的角度,可以從執行角度和環境依賴上來說。簡單理解,作為腳本語言,你可以單獨寫一行 <?php echo "Hello World";,命名為任意文件,然后使用 php 解釋器來執行。甚至可以使用 php -a 進入交互環境執行任何代碼。go 這種編譯型語言就不是這樣。因為是先編譯后執行,go 一定需要知道程序的入口文件和入口函數。所以一個程序的執行一定需要 main 函數(go test 文件除外)。雖然 go 也提供了 run 指令省略到編譯的步驟。在環境依賴上,執行 php 的服務器一定需要預裝固定版本 php 解釋器,而編譯成二進制文件的 go 程序則只需要在對應架構的服務器上即可運行。這本質上是 php 的解釋器扮演的才是 go 編譯后的程序的角色,而腳本則是在 php 解釋器構建的一層虛擬機上執行的。所以腳本語言在不同平臺上表現的一致性更好,而使用編譯型語言則需要有更好的操作系統和網絡底層知識。
2. 動態語言 vs 靜態語言
動態語言與靜態語言又分別被稱為弱類型語言和強類型語言,其實這樣描述也更加形象。PHP 會在執行的過程中做隱式類型轉換(雖然也提供了類型轉換的函數和關鍵字),go 的類型轉換卻需要手動、強制的來執行。弱類型語言帶來了很多便利性,但是也隱含了很多問題,以至于 PHP 要引入 === 這種比較方式,不過經驗豐富的 PHP 開發應該是能在每一個變量定義之前都確認好它的數據類型的。go 語言中不存在隱式轉換的問題,但是寫起來肯定也沒有那么爽,光是 int 都有多種長度的類型,會讓很多新手不太適應,同樣的道理,定義每一個變量之前都稍加思考,就能輕松解決這個問題。go 提供了 := 和 var 關鍵字的賦值方式,編譯器會根據初始化的值自動推導出相應的類型,但是這個用法同樣也要求你小心處理作用域的問題,不妨猜一下下面這段代碼的輸出:
package main
import (
"fmt"
)
func main() {
var a int
a = 1
if a, ok := foo(); ok == true {
fmt.Println(a)
}
fmt.Println(a)
var ok bool
if a, ok = foo(); ok == true {
fmt.Println(a)
}
fmt.Println(a)
}
func foo() (int, bool) {
return 2, true
}
3. Go 還要不要 MVC
先說我的觀點:不需要。其實不只是 go 開發,PHP 的微服務框架比如 Slim 默認也不是按照 MVC 的方式組織代碼的。本身現在前端工程化程度越來越高,一般都拉出去單獨開項目,也不需要接口項目準備 V 的部分,所以說 MVC 是時代的產物,可以被淘汰了。再者,go 使用的函數名、變量一般都比較簡潔,Controller 這個長長的單詞看起來真的有點突兀。go 語言本身有一些約定性的命名方式,對代碼的訪問、編譯和執行都是有影響的,比如 internal 目錄下的內容不能被外部包訪問,在搭建 go 項目的時候,也應該按照這些約定來,這才符合 go 的規范。這里有一個 go 項目目錄組織的 demo:https://github.com/golang-standards/project-layout, 值得參考一下。也可以看一下這篇文章,寫的很不錯:https://draveness.me/golang-101/。
4. Go 還要不要框架
既然 MVC 都不需要了,那開發框架還需不需要呢?這個問題沒有固定答案,因為同樣在 PHP 中,框架的概念也漸漸弱化,包的概念逐漸強化。只要有 Composer,徒手搭建一個 PHP 的框架不是什么難事。從 1.13 的版本之后,go 終于有了默認統一的包管理方式,雖然不算完美,但總算解決了以前管理混亂、限制太多的問題,具體的介紹可以參考官方說明:https://blog.golang.org/using-go-modules。選一個或者寫一個好用的基礎結構,配上一些不錯的包,就可以愉快的開始項目開發了。
最后我還是想說明一下,語言本身可能有設計上的不同,但不應該有好壞之分,特別是應用比較廣泛的語言,自然是因為其自身的某些特性吸引人。選擇適合自己的、適合業務的就可以,不要當語言上的精神貴族。
總結
以上是生活随笔為你收集整理的php程序员如何转go,写给 PHP 程序员的 Go 入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单例模式(C++)
- 下一篇: c语言fgets函数的用法