Go 語言

我給朋友推薦 Go 有三個原因,安全性、生產力和並發性:

安全
個人而言,你和我或許完全有能力在 C 中編寫程序,既不會洩漏內存,也不會不安全地重複使用內存。然而,整體上,即使有超過 40 年的經驗,用 C 的程序員也無法可靠地這樣做。

儘管靜態代碼分析、valgrind、tsan 以及 “-Werror” 已經存在了幾十年,卻很少有證據表明這些工具被廣泛認可,更不用說廣泛採用。總而言之,事實表明,程序員根本無法安全地管理自己的內存。現在是離開 C 的時候了。

Go 不需要程序員直接管理內存,所有內存分配都由語言運行時自行管理,使用前初始化,必要時檢查邊界。它肯定不是提供這些安全保障的第一個主流語言,Java(1995)可能是該冠軍的競爭者。關鍵是,世界對不安全的編程語言沒有胃口,所以人們默認認為,Go 是內存安全的。

開發人員生產力
從 20 世紀 70 年代末,開發人員的時間變得比硬件所耗費的時間更昂貴了。開發人員的生產力是一個不斷擴展的話題,但它歸結為這一點:你花了多少時間做有用的工作,又有多少時間等待編譯器或者失望地迷失在外部代碼庫中。

有個笑話說 Go 是在等待 C ++ 程序編譯時開發的。快速編譯是 Go 的一個重要功能,也是吸引新開發人員的關鍵工具。雖然編譯速度仍然是一個永久的戰場,但公平地說,在其他語言中需要幾分鐘的編譯,在 Go 中只需要幾秒鐘。

Go 程序員意識到生產力的更根本的問題是代碼是為了讀而寫的,所以將代碼的閱讀行為放在編寫之上。 Go 通過工具和自定義來強制所有代碼格式化成特定的樣式。這消除了學習項目特定語言的方言時的困難,並有助於發現錯誤,因為它們看上去就是不正確。

由於專注於分析和機器輔助,Go 開發人員開始採用越來越多的工具來發現常見的編碼錯誤,這種工具從來沒有在C 語言開發者中產生共鳴- Go 開發人員希望工具幫助他們保持代碼清潔。

並發性
十多年來,芯片設計師一直在警告免費午餐將會結束。從最低端的手機到最耗電的服務器,硬件的並行性以更多、更慢、堆砌 cpu 內核的形式出現,但只有當你的語言可以利用它們才有意義。因此,並發特性需要內置到我們編寫的要在今天的硬件上運行的軟件中。

通過提供一種基於協程的輕量級並發模型,或者是 Go 中已知的 goroutines,Go 超越了那些暴露操作系統的多進程或多線程並行模型的語言。 goroutines 允許程序員避開復雜的回調,而語言運行時確保有足夠的線程來保持你的內核的活躍。

總結
我給朋友推薦 Go 有三個原因:安全性、生產力和並發性。有些語言可以涵蓋一個也有可能是兩個方面,但是這三個方面的結合使得 Go 成為主流程序員的絕佳選擇。

https://zhuanlan.zhihu.com/p/26397991
https://dave.cheney.net/2017/03/20/why-go

為什麼要從其他語言轉換到 Go?Go 語言如何帶給公司更大的利益?否則為什麼要多花時間跟人力去嘗試 Go 語言。如果團隊要建置一個商業 Web 服務,選擇 Go 語言的最主要優點包括如下:

● 快速又簡單部署
● 支援跨平台編譯
● 保護原始程式碼
● 善用多核心處理

https://blog.wu-boy.com/2017/01/business-benefits-of-go/
http://cepave.com/why-they-choose-golang/
https://kknews.cc/tech/k8ngmev.html


Go,為了方便瀏覽和識別,部分人稱其為 Golang,是 Google 開發的一種編譯式並具有垃圾回收功能的程式語言。Go 語言於2009年11月正式宣布推出,成為開放原始碼專案,並在 Linux、Mac OS X、Windows 平台上實現。

Go 語言的語法接近 C 語言,但是對於變數的聲明是不同的。與 C++ 相比,Go 語言並不包括如例外處理、繼承、泛型等功能,但增加了 Slice、並行、管道、垃圾回收、Interface 等特性的語言級支援。

在 Go 語言中有幾項規定,而且這些是強制的,當不符合以下規定時編譯將會產生錯誤。

 1. 每行程式結束後不需要撰寫分號(;)。
 2. 花括號({)不能夠換行放置。
 3. IF 判斷式和 For 迴圈不需要以小括號包覆起來。

Go 語言亦有內建 gofmt 工具,能夠自動整理程式碼多餘的空白、變數名稱對齊、並將對齊空白轉換成 Tab。

Go 語言的重要特色在於容易使用的併行設計,這個方法叫做 Goroutine,透過 Goroutine 能夠讓程式以異步的方式執行,而不需要擔心一個函式導致程式阻塞,因此 Go 語言也非常適合網路應用。

讓我們假設有個程式,裡面有兩個函式:

func main() {
    // 假設 loop 是一個會重複執行十次的迴圈函式。
    // 迴圈執行完畢才會往下執行。
    loop()
    // 執行另一個迴圈。
    loop()
}

在這個時候我們可以透過 go 來讓其中一個函式以並行的方式執行,如此一來就不需要等待該函式執行完後才能執行下一個函式。

func main() {
    // 透過 `go`,我們可以把這個函式以並行執行,
    // 如此一來這個函式就不會阻塞程式的執行。
    go loop()
    // 執行另一個迴圈。
    loop()
}

Goroutine 是類似線程的概念,但並不是線程。線程屬於系統層面,通常來說建立一個新的線程會消耗較多的資源且管理不易。而 Goroutine 就像輕量級的線程,但被稱為併發,一個 Go 程式可以執行超過數萬個 Goroutine,並且這些效能都是原生級的,隨時都能夠關閉、結束。透過 GOMAXPROCS 參數能夠限制 Gorotuine 可以佔用幾個系統線程來避免失控。

在內建的官方套件中也不時能夠看見 Goroutine 的應用,像是 net/http 中用來監聽網路服務的函式實際上就是建立一個不斷執行迴圈的 Goroutine。


維基百科:https://en.wikipedia.org/wiki/Go_(programming_language)

Go 是由 Google 設計用來解決 Google 的問題:http://www.csdn.net/article/2014-12-09/2823025


在 Go 語言中,語法規定了我們敲入怎樣的字元才能夠撰寫出 Go 語言編輯器認可的程式。

Go 語言的所有原始程式碼都必須是 Unicode 編碼標準的 UTF-8 格式。

Go 語言的語言符號可分為:識別符號 (identifier)、關鍵字 (keyword)、運算符號 (operator)、分隔符號 (delimiter)、以及字面常數 (literal)。

識別符號可以由許多字母、底線 "_" 、和數字組成,而第一個字元必須為字母。

一個可匯出的識別符號需要滿足兩個前提條件,第一個條件是關於字母的大小寫差異,當第一個字元是大寫時,其存取權限為「公開的」,小寫的存取權限為「套件級私有的」。第二個條件是關於識別符號必須是被宣告在一個程式套件中的變數或類型的名稱,或是屬於某個結構類型的欄位名稱或方法的名稱。

Go 語言的關鍵字只有 25 個,可以分為如下 3 大類。

1. 程式宣告:import, package

2. 程式實體宣告和定義:const, chan, func, interface, map, struct, type, var

3. 程式流程控制:go, select, break, case, continue, default, defer, else, fallthrough, for, goto, if, range, return, switch


Golang: Understanding 'null' and nil => https://newfivefour.com/golang-null-nil.html


Golang 的 if...else、switch 語法:https://openhome.cc/Gossip/Go/IfSElsewitch.html

與 C/C++ 或 Java 等語言不同的是,Go 的 switch 比對成功後,不會自動往下執行,因而不用撰寫 break,有多個條件想符合時,在同一 case 中使用逗號區隔。如果真的想在比對成功後,往下一個 case 中的陳述執行,可以使用 fallthrough。

Go 語言支援的型態與其範圍:https://ithelp.ithome.com.tw/articles/10156046


Golang之類型及轉換介紹:https://kknews.cc/zh-tw/other/j69mqyp.html

在 Golang 如何精確計算小數:https://imhanjm.com/2017/08/27/go%E5%A6%82%E4%BD%95%E7%B2%BE%E7%A1%AE%E8%AE%A1%E7%AE%97%E5%B0%8F%E6%95%B0-decimal%E7%A0%94%E7%A9%B6/




Go 是 物件導向語言 嗎?

從歷史來看,物件導向觀念起於 Simula 語言,歷經 Smalltalk-80 等融入語言之中,在 Java 話題性高的年代風行草偃,但隨之而來的就是各種批評,有開發者甚至棄之如敝屣,在新生代的語言中,Go 語言乍看令人迷惑,表面上看起來有物件導向的概念,實際上卻又似乎不是那麼一回事。

如果在網路上搜尋,可以找到無數種不認同物件導向的理由。有人認為,它創造了太多的名詞與產物,封裝、繼承、多型、模式、框架、UML 與各種方法論。

在抨擊物件導向的相關文件中,儘管理由眾多,然而其中必定會提到的一點就是繼承,特別是只為了重新使用程式碼而使用了繼承,卻因為繼承的階層性反而帶來了許多困擾。

對此,Erlang 的創建者 Joe Armstrong 有個傳神的比喻:「你只是要根香蕉,結果卻得到一隻拿著香蕉的大猩猩,還有整座叢林。」

詳見:http://www.ithome.com.tw/voice/107839




Golang 編譯出來的執行檔,本身就能擔任 Web Server 的功能:

package main

import (
"fmt"
"net/http"
)

type Hello struct{}

func (h Hello) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<h1>你好!</h1>")
}

func main() {
var h Hello
http.ListenAndServe("localhost:4000", h)
}


執行後,使用 Browser 打開網址,如下圖:



https://golang.org/doc/articles/wiki/
https://golang.org/pkg/net/http/

Golang 適合做 web 開發嗎:https://www.zhihu.com/question/30649593

從 PHP 轉換到 Golang 的筆記:
https://github.com/YamiOdymel/PHP-to-Golang/
https://yami.io/php-to-golang/




[ 用 Golang 完整實作出一個網站的過程中可能會需要的範例 ]

給初學者的範例:https://openhome.cc/Gossip/Go/HelloWorld.html

Golang 的 Package 之組織方式 (关于 golang 中包(package)的二三事儿):http://www.cnblogs.com/dajianshi/p/3596492.html

Go 語言實現處理表單輸入範例:http://www.jb51.net/article/62552.htm

GO 與 MySQL 的結合使用
http://www.grdtechs.com/2016/11/11/go-use-mysql/
https://segmentfault.com/a/1190000003036452
http://studygolang.com/articles/3022
http://go-database-sql.org/
https://github.com/Go-SQL-Driver/MySQL/wiki/Examples

連結資料庫

func main() {
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database?charset=utf8")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
}

MySQL 欄位使用 Null 值時需要額外處理:https://golang.org/pkg/database/sql/#NullString


在開發動態網頁時,我們常常將不變的部分提出成為模板,可變部分通過後端程式來生成動態網頁,Golang 就此提供了 text/template 與 html/template package 支持:

http://ju.outofmemory.cn/entry/255384
http://www.admpub.com/blog/post-221.html
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/07.4.md

https://www.google.com.tw/search?q=渲染模板+golang
http://blog.jiamin.info/2016/12/29/Golang%20Template%20%E7%AE%80%E6%98%8E%E7%AC%94%E8%AE%B0/
https://golang.org/pkg/text/template/#example_Template
https://golang.org/pkg/html/template
http://www.nljb.net/default/Golang-%E5%81%9A%E8%87%AA%E5%B7%B1%E7%9A%84%E5%8A%A8%E6%80%81%E7%BD%91%E7%AB%99/
http://www.ctolib.com/topics/2712.html
https://segmentfault.com/a/1190000010283841
http://blog.xiayf.cn/2013/11/01/unescape-html-in-golang-html_template/

表單驗證 範例:https://kknews.cc/other/z63p2ng.html
留言板 範例:http://www.ctolib.com/topics-41088.html

在 template 中多層循環:
https://www.google.com.tw/search?q=golang+range+%E6%A8%A1%E6%9D%BF
http://golangtc.com/t/50d6bf54320b527e6d00001a
https://github.com/jimmykuu/gopher/blob/master/templates/topic/show.html

Golang 開發 web 應用時的靜態文件處理方法:
http://blog.csdn.net/yavobo/article/details/9374221
http://www.01happy.com/golang-http-file-server/
http://blog.csdn.net/yavobo/article/details/9380011
https://gist.github.com/erasin/6339684

如何在根目錄同時提供主頁與靜態文件,比如說 robots.txt, sitemap.xml,favicon.ico 等必須放在根目錄的檔案:
https://stackoverflow.com/questions/14086063/serve-homepage-and-static-content-from-root
https://stackoverflow.com/questions/28793619/golang-what-to-use-http-servefile-or-http-fileserver

Cookie 的使用:
http://www.jianshu.com/p/3b84aec28855
http://studygolang.com/articles/5905
http://www.grdtechs.com/2016/07/10/go-setcookie/
https://segmentfault.com/a/1190000004556040

Cookies 的替代品:在與伺服器傳輸資料時,通過在位址後面添加唯一查詢串,讓伺服器識別是否合法用戶,也可以避免使用Cookie。

Golang 的字串處理方式:
https://justjii-justdrink.rhcloud.com/archives/1351
http://ithelp.ithome.com.tw/articles/10158675

隨機字串演算法效率評估測試:http://codeday.me/bug/20170607/22281.html

使用 fmt.Sprintf 或標準函數庫做類型轉換的差異:http://liyangliang.me/posts/2014/06/donnot-use-fmt-sprintf-for-type-conversion/

Go 語言中操作 slice 的技巧:http://tsunghao.github.io/post/2015/02/useful-tips-of-slice-tricks-in-golang/

將矩陣存入 Cookie  (将map存入cookie):https://my.oschina.net/tongjh/blog/266051

Json 編碼 / 解碼:
http://lolikitty.pixnet.net/blog/post/129844768-golang-%2C-go-%E8%AA%9E%E8%A8%80-%E5%85%A5%E9%96%80%EF%BC%9Ajson-%E7%B7%A8%E7%A2%BC---%E8%A7%A3%E7%A2%BC
http://www.cnblogs.com/fengbohello/p/4665883.html

用 Go 語言實現 PHP 的 serialize() 和 unserialize() 函數:
https://github.com/wulijun/go-php-serialize
https://github.com/yvasiyarov/php_session_decoder

獲取 當前的 URL:
https://www.jianshu.com/p/f95558a49e98
http://www.qingpingshan.com/jb/go/111280.html

Golang 的 time package:http://www.cnblogs.com/zhepama/archive/2013/04/12/3017230.html
時間的加減:https://studygolang.com/articles/8919

SHA256 散列實作:https://stackoverflow.com/questions/30956244/golang-base64-encoded-sha256-digest-of-the-user-s-password
https://play.golang.org/p/oFBePRQzhN
PBE加密算法概念:http://baike.baidu.com/item/PBE/13013200
用途於密碼的標準作法:https://github.com/elithrar/simple-scrypt
實作橢圓曲線加密算法:https://www.urecv.com/archives/135

交叉編譯:http://dmdgeeker.com/goBook/docs/ch01/cross_compile.html

在 Windows 下 cmd 進行交叉編譯

使用 go env 查看 Go 相關環境變數
  1. set CGO_ENABLED=0
  2. set GOOS=linux
  3. set GOARCH=amd64
  4. go build main.go

# 編譯到 linux 64bit
GOOS=linux
GOARCH=amd64

# 編譯到 linux 32bit
GOOS=linux
GOARCH=386

# 編譯到 windows 64bit
GOOS=windows
GOARCH=amd64

# 編譯到 windows 32bit
GOOS=windows
GOARCH=386

# 編譯到 Mac OS X 64bit
GOOS=darwin
GOARCH=amd64

https://golang.org/cmd/cgo/
The cgo tool is enabled by default for native builds on systems where it is expected to work. It is disabled by default when cross-compiling. You can control this by setting the CGO_ENABLED environment variable when running the go tool: set it to 1 to enable the use of cgo, and to 0 to disable it. The go tool will set the build constraint "cgo" if cgo is enabled.

商業軟體一定要刪除 debug 信息 go build -ldflags "-s -w" ( 破解 Go 執行檔的相關討論 ):
https://gocn.io/question/487
http://golangtc.com/t/5639e100b09ecc3197000004

-w 禁止生成debug信息,注意使用该选项后,无法使用 gdb 进行调试
-s 禁用符号表
可以使用 go tool link --help 查看 ldflags 各参数含义
https://javasgl.github.io/go-build-args/

Go 內嵌靜態資源:
使用 Go 開發應用的時候,有時會遇到需要讀取靜態資源的情況。比如開發 Web 應用,程式需要加載模板文件生成輸出的 HTML。在程式部署的時候,除了發布可執行檔,還需要發布靜態資源。
這給發布過程增加了一些麻煩。既然發佈單獨一個可執行檔是非常簡單的操作,就有人會想辦法把靜態資源也打包進 可執行檔 中,比如說 go-bindata, go.rice, esc 等等。
詳閱 http://blog.golangclub.com/articles/5068




怎麼學習 Golang:https://gocn.io/question/4

《Effective Go》中英双语版:https://bingohuang.gitbooks.io/effective-go-zh-en/content/

Go 語言聖經(中文版):https://wizardforcel.gitbooks.io/gopl-zh/content/

Golang Basic:http://blog.jex.tw/blog/2014/01/20/golang-basic/

Go 快速入門:http://wdxtub.com/2016/08/11/golang-first-step/

Go Web 编程:
https://www.kancloud.cn/kancloud/web-application-with-golang/44105
http://www.runoob.com/go/go-tutorial.html
https://astaxie.gitbooks.io/build-web-application-with-golang/content/zh/
http://dmdgeeker.com/goBook/index.html
https://zengweigang.gitbooks.io/core-go/content/

Youtube 教程:
https://www.youtube.com/playlist?list=PL7vIp5DG7s8C50r0yt8U6EuH2kxYG5XMD

Go: SQL Databases:
https://www.alexedwards.net/blog/practical-persistence-sql

Golang 新手可能會踩的50個坑
https://segmentfault.com/a/1190000013739000

Golang 代码示例汇总持续更新:http://www.01happy.com/golang-example/

Golang concepts from an OOP point of view:https://github.com/luciotato/golang-notes/blob/master/OOP.md

https://openhome.cc/Gossip/Go/index.html
http://www.runoob.com/go/go-tutorial.html
https://hsinyu.gitbooks.io/golang_note/content/index.html

Go 程式設計導論:http://golang-zhtw.netdpi.net/

初學 Golang 30 天系列:http://ithelp.ithome.com.tw/users/20079210/ironman/721

各種加密算法在 Go 語言中的使用方式:https://blog.51cto.com/634435/2117647

30天就 Go:教你打造 LINE 自動回話機器人 系列:http://ithelp.ithome.com.tw/users/20103452/ironman/1211

http://www.golang-book.com/books/intro
http://www.wklken.me/posts/2014/03/02/01-intro.html

Go 指令教學:https://github.com/hyper0x/go_command_tutorial

Golang 官方網站,可以線上執行、分享程式碼、參考文件等相關內容:https://golang.org/

Go 原始碼:https://golang.org/src

官網下的功能,可以說是 Golang 練功房:https://tour.golang.org/welcome/1

各種 Golang 程式碼範例:https://gobyexample.com/

Go packages 的文件,包含 opensource 的 package:
https://godoc.org/
https://github.com/golang

Google Go 語言從入門到應用必備開源項目:https://kknews.cc/tech/anpxrq6.html

有的沒的 Go 筆記:http://www.evanlin.com/weekly-note-20150206/

Go 語言的學習資源:http://www.ituring.com.cn/tupubarticle/3651

旨在成為下一代的 robotics/IoT framework:https://gobot.io/

在 Go 語言用一行程式碼自動化安裝且更新 Let’s Encrypt 憑證:https://blog.wu-boy.com/2017/04/1-line-letsencrypt-https-servers-in-golang/

用 Golang 寫 Command line 工具:https://blog.wu-boy.com/2017/02/write-command-line-in-golang/

以 Go 語言快速實作 HTTP GET/POST API:http://cepave.com/http-restful-api-with-golang/

Golang 如何處理多國使用者的網頁輸出:http://www.evanlin.com/go-generate-content-by-user-lang/

Go 語言的錯誤訊息處理:https://blog.wu-boy.com/2017/03/error-handler-in-golang/




大家使用 Go 語言的心得分享與社區:

2014 ~ 2017 論壇討論 https://www.douban.com/note/353996627/
2015 某網友的個人分享文章 https://read01.com/kgaRQ.html
2015 年中開始採用 Golang 的團隊之經驗分享 https://gocn.io/article/23

Go 與 桌面 (GUI):https://www.zhihu.com/question/22483719

Golang 中國:http://golangtc.com
Go 語言中文網:http://studygolang.com/


程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...