最近項目完工,遂學習學習go,寫一下學習記錄,加強記憶,順帶梳理下和php的差異
1.go是編譯型語言
想想 C 語言編譯、鏈接和安裝可執行程序的繁瑣步驟,首先要通過 configure
腳本對特定平臺進行檢測,比如是否包含 GCC 等編譯工具,然後生成 Makefile 文件,該文件定義了編譯、鏈接規則,爲下一步編譯工作做準備,接下來就是執行 make
命令進行編譯工作,最後再執行 make install
命令完成應用程序的安裝,經歷過這些步驟纔可以實現將 C 程序源代碼編譯爲可執行程序。
安裝過php拓展的都知道,php拓展也是由c編寫的,需要編譯安裝,也是很麻煩
從上面的構建過程中可以看到,真正的構建命令就一句:
go build calc
這就是爲什麼說 Go 命令行工具是非常強大的。我們不需要寫 makefile
,因爲這個工具會替我們分析,知道目標代碼的編譯結果應該是一個包還是一個可執行文件,並分析 import
語句以瞭解包的依賴關係,從而在編譯 calc.go
之前先把依賴的 simplemath
編譯打包好。Go 命令行程序制定的目錄結構規則讓代碼管理變得非常簡單。
2.go是靜態語言
var v1 int //聲明變量 並未賦值
純粹的變量聲明,Go 語言引入了關鍵字 var
,並且將類型信息放在變量名之後
PHP 是動態語言(暱稱「鴨子類型」),變量在聲明時沒有類型之說,變量類型是在運行時動態判斷的,不需要關鍵字 var
修飾,而是以 $
作爲變量名前綴實現類似的效果,也沒有這種純粹的聲明語句(類的成員變量除外)
php可以直接聲明變量,而後再賦值,這是弱類型語言的好處,當然壞處是 弱類型語言的使用在某些場景下內部的類型自動轉換,導致業務判斷邏輯,不爲預期發展,而踩到坑(此時 可以強類型比較,或強制轉換類型,即對賦值後的變量定義類型)
3.go的變量初始化
v3 := 10 //省略 var,編譯器可以自動推導出v3的類型
對變量同時進行聲明和初始化時,指定類型已不再是必需的,Go 編譯器可以從初始化表達式的右值推導出該變量應該聲明爲哪種類型(純粹的變量聲明時可不能省略類型,那樣會編譯器會報錯),這讓 Go 語言看起來有點像動態類型語言,但是與 PHP 等動態語言不通的是,這個推導是在編譯期做的,而不是運行時,所以 Go 語言還是不折不扣的靜態語言。
php中變量類型的確認是在運行期間,而go是在編譯期間,(個人理解,編譯這個動作包含了運行,或者說運行時的檢測),所以php作爲解釋型語言,不需要編譯,這是開發效率的提升,同時也是生產時性能的犧牲
關於變量初始化和聲明:
在 PHP 中,通常變量聲明和初始化是一體的,即通過初始化的方式完成變量的聲明,類的成員變量除外。
在 Go 語言中,變量初始化和變量賦值是兩個不同的概念,變量初始化集變量聲明和賦值爲一條語句,
即 v3 := 10
變量賦值則是先聲明變量,再對其進行賦值,
即
var v1 int
v1 = 123
初始化只能執行一次,賦值則可以執行多次。見下
另外,出現在 :=
左側的變量不應該是已經被聲明過的,否則會導致編譯錯誤,比如下面這個寫法:
var i int
i := 2
會導致如下這種編譯錯誤:
no new variables on left side of :=
參考鏈接:https://laravelacademy.org/post/19724.html