前端人員現在都是號稱全棧工程師,前端後端都要抓都要上,雖然這很好,號子喊的也有點亮,但是JS作為了一個前端語言,硬要拿來做後端,或者用來做其他方面編程,還是是有些侷限。這時候不妨換個思路,學一下真正的後端語言未嘗不是一個好方法。本文蟲蟲就來給JS開發人員介紹Golang語言,以及JS人員如何開始寫Golang。
![前端JS開發人轉Golang初步](http://p2.ttnews.xyz/loading.gif)
本文純屬技術探討,不討論語言紛爭,反正各種地方已經爭的已經太多了,也沒個統一的結果。如果你懂一些JavaScript/TypeScript開並且想嘗試下Golang語言,那本文就是寫給你的。
一些相似點
與JS一樣,Golang使用垃圾收集器。我們也不需進行任何內存分配/處置。
函數式開發是Golang重要組成部分。
變量和函數具有作用範圍。
Golang函數中也可使用閉包。
最後,Golang是一種非常簡練的語言,和JS一樣,你可以定義變量,結構,函數,執行for循環、if語句。Golang介於C語言和JavaScript之間,具備兩者的一些通性。
兩者差異
兩個語言的差異還是相當明顯的,我們在此只列出一些JS開發人員最關注的一些內容,其他內容要參考相關官方文檔。
首先,Golang是靜態類型語言,需要在編譯時檢測類型錯誤。
雙方垃圾收集器除了上面提到的相同點外,但是兩者還有很大差異的:golang 的GC非常快,沒有滯後。
JavaScript運行基於一個主線程(事件循環)和其他幾個執行外部IO的線程。在Golang中,併發協程goroutine是強項,對多線程開發是他優勢(當然Node.js的併發,基於async/await,也是不容小覷的)。
Golang語言使用指針。為了能夠正確地執行GC並避免讀/寫內存不足,Go指針不允許在指針上做任何計算。你不能像C裡一樣對指針做類似於p++等的操作。
Golang比JavaScript更快!基於不同的基準測試,有些情況下可以快10倍。
Golang更適合服務器,而JS已經到處都有了。
golang不支持OOP
Golang使用結構,不支持面向對象。這在oo大行其道的今天,可以說是一股清流。當然oo如果不講形式,光實現其思想,比如繼承,多態等話,golang也是有方法可以實現的。
快捷語法
在Golang中,語法形式都用快捷方式。它幾乎感覺好像可以用快捷寫法來做Golang開發。
// 一般形式
var chongchong Int = 1024
// 短鏈接形式
chongchon := 1024
剛開始,可能不好適應,但是如果你堅持寫Golang語言,最終你可能會適應並且最終會喜歡上它。
lodash的Map/Reduce
Golang是強類型的,而且不支持泛型,所以很多時候做數據處理可能有點費勁,比如對json類型轉化,在golang中就非常費勁,要寫大量的條件判斷才能實現。同樣的你習慣於使用的lodash庫的map/reduce函數,你也沒法子在 golang中找到對應的用法。好消息是,相關的計劃已經在Golang社區提出,會在將來版本中推出。
包
很多人安裝Go並想創建第一個項目時,會創建一個文件夾並將所有代碼放在那裡,構建它,並運行。這不是Golang典型的運作方式。你所有項目都應位於同一個全局src文件夾下,位於項目特有的文件夾下,通常是Github路徑(例如:~/go/src/github/bollwarm/gh-Template)。這種方法存在許多問題,例如項目的依賴關係在同一個src文件夾下,版本成為一個大問題。
Golang確實支持供代理文件夾(類似於JS中的node_modules),但它將獲取主分支...
有許多嘗試來解決這個問題,但是知道目前Go中的依賴關係還是有點費勁,需要改進。
測試
Golang鼓勵測試,以至於當編譯器檢測到測試文件時(通過文件名_test.go),它會在你代碼build是時候會自動排除測試代碼。
語法法
首先我們先來介紹下golang基本語法。
基本規則
代碼行結束不用分號。
數組中的最後一個元素後面也必須帶","。
var cc = [3]int{
1,
2,
3,
}
if語句中的{ 在一行,不能換行。
public/private屬性由其變量名稱的第一個字母是否大寫來定義。
var CCisPublic = "可以從變量作用域範圍外訪問"
var ccprivateValue = "只能在變量包範範圍內訪問"
基本類型
//常見類型
var num int = 5
var pi float32 = 3.14
var name string ="Gil"
var isActive bool = true
//沒有初始化
var num int // 值為0
var pi float32 // 值為0
var name string // 值為空,""
var isActive bool // 值為false
var var person Person //值為nil
var a, b, c = true, "Hi", 0.5 //多個變量同時初始化
num := 5 // `var` 省略了,類型由初始化的值自動推斷
循環結構
我們最常見的for循環
for i := 0; i < 100; i++ {
sum += i
}
// while語句
for sum < 1000 {
sum += sum
}
// 無限制loop,慎用
for {
}
分支控制
注意分支結構中,不需要寫在括弧中:
if age < 18 {
return true
} else {
return false
}
switch結構不需要增加`break`:
switch state {
case "ACTIVE" :
deactivate()
case "INACTIVE":
activate()
default:
fmt.Printf("Unknown state")
}
函數
簡單的函數結構為:
func add(a int, b int) int {
return a + b
}
// 返回多個值
func swap(a, b int) (int, int) {
return b, a
}
![前端JS開發人轉Golang初步](http://p2.ttnews.xyz/loading.gif)
命名返回值:
func namedResult(input int) (output int) {
output = 42
return
}
我們舉個實例rectProps函數,它接受一個矩形的長和寬,並返回該矩形的面積和周長:
當然,這而只是基本語法的快速預覽,還有很多高級功能,比如channes, 結構, 和接口等,以後有機會我們再來論述,今天就權當一個開頭把。
閱讀更多 蟲蟲安全 的文章