golang(0)

我從 1 年前開始關注 Golang, 但一直沒有時間細緻地學習 Golang 的語法。
有關設計哲學,和語法的概覽,我倒是看了不少,前兩天買了一本《Go語言程序設計》,打算認真學習一下。
作爲一個 C++ 出身的程序員,以及一個 Unix 粉,和一個開源主義者,Golang 的設計哲學相當得對我的胃口。
我對 Golang 的理解是“一個服務器端編程語言”,下面我來談談 Golang 吸引我的地方。

精心設計過的語法

這是和 PHP 比的,我之前一直在使用的 PHP 恐怕是流行的編程語言中,唯一一個語法沒有經過精心設計的。
Golang 是由三位大牛共同設計的,它很年輕,沒有歷史包袱。
Golang 吸收了一些現代語言的語法,比如數組切片,多返回值等,但並不多,畢竟 Golang 的定位是工業級。

工業級

Golang 不是一個玩具,它甚至比很多流行的編程語言更加嚴肅,在和 Java 靠齊。
Golang 的語法設計就是爲了讓代碼更加易讀,而不是像 C++ 那樣留給了大牛們很大的發揮空間。
Golang 自帶代碼格式化工具,要求所有代碼都有一致的代碼風格。

社區

Golang 的官網就是非常有活力的,首先就是一個 Hello World 和一個在線編譯器。
目前 Golang 由 Google 牽頭維護,包括 Google 在內的不少大公司都在使用 Golang.
文檔,參考清晰地列在那裏,第一時間提供給你了需要的信息,而且 Golang 還有個萌萌的吉祥物。
至於中文 Golang 社區的成長,也是相當迅速的,僅僅最近一年,就出現了兩本完整的 Golang 中文教程,而且都是開源的。

本地代碼和靜態鏈接

知道 Linux 下最大的坑是什麼麼?就是動態鏈接庫。
爲什麼 Linux 大部分軟件都要求編譯安裝,就是因爲動態鏈接庫。
Golang 通過完全靜態鏈接的方式避開了這個大坑。
同時 Golang 編譯出的是本地代碼,服務器無需環境即可運行。
沒錯,不需要任何環境,不需要任何動態鏈接庫。

靜態類型和接口

Golang 是一個靜態類型語言,變量在編譯時,就有一個唯一確定的類型。
因爲 Golang 削弱了指針的功能,因此 Golang 甚至比 C/C++ 更加“靜態”.
這使得 Golang 可以在編譯時就進行完整的類型檢查,在編譯時就可以找到大部分的語法錯誤。

Golang 接口的創新在於,將描述接口的工作,從定義類的時候,轉移到了使用對象的時候。
這使得 Java 等語言中原本繁瑣的接口功能,在 Golang 中變得非常好用。
Golang 的類型系統建立在接口上,同時接口和靜態類型檢查也是緊密相關的。

簡化的 OOP

C++, Java 中所謂的面向對象思想,略顯複雜,Golang 則將 OOP 思想做了極大的簡化,只留下了最核心的特徵。

併發支持

Golang 的併發支持由 goroutine 和 channel 支持。
goroutine 是一種輕量級線程,目的是對 CPU 核心進行抽象,最大限度發揮多核心 CPU 的計算能力。
而 channel 是一種類似管道的線程間通訊機制,將經典的加鎖模型,轉換爲了類似 Unix 進程間通訊的管道模型。

標準庫

作爲一個服務器端編程語言,Golang 的標準可以說非常全面,大部分的算法,協議都包括在了標準庫中。
對於網絡編程,Golang 幾乎是開箱即用的。
而且 Golang 也借鑑了 Python 等語言的包管理器,安裝軟件包非常方便。

錯誤處理

Golang 沒有傳統的異常機制。
對於非致命的錯誤,Golang 使用返回值來報告(Golang 支持多返回值).
對於致命的錯誤,Golang 直接選擇“崩潰”掉(當然也有恢復機制), 不過按照 Golang 的哲學,既然是致命錯誤,就應當掛掉。
還有 defer 關鍵字,用於將一個語句“綁定”到函數退出時執行,無論是通過各種途徑退出,這可是 C/C++ 裏面的大問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章