前端JS開發人轉Golang初步

前端人員現在都是號稱全棧工程師,前端後端都要抓都要上,雖然這很好,號子喊的也有點亮,但是JS作為了一個前端語言,硬要拿來做後端,或者用來做其他方面編程,還是是有些侷限。這時候不妨換個思路,學一下真正的後端語言未嘗不是一個好方法。本文蟲蟲就來給JS開發人員介紹Golang語言,以及JS人員如何開始寫Golang。

前端JS開發人轉Golang初步

本文純屬技術探討,不討論語言紛爭,反正各種地方已經爭的已經太多了,也沒個統一的結果。如果你懂一些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初步

命名返回值:

func namedResult(input int) (output int) {

output = 42

return

}

我們舉個實例rectProps函數,它接受一個矩形的長和寬,並返回該矩形的面積和周長:

前端JS開發人轉Golang初步

當然,這而只是基本語法的快速預覽,還有很多高級功能,比如channes, 結構, 和接口等,以後有機會我們再來論述,今天就權當一個開頭把。


分享到:


相關文章: