一天學會 Go 語言 2017.03.18 吳柏毅 Bo-Yi Wu
  Blog: https://blog.wu-boy.com/ GitHub: http://github.com/appleboy   Slide: https://www.slideshare.net/appleboy
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go concurrency 介紹   Go 簡易 HTTP 伺服器   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go concurrency 介紹   Go 簡易 HTTP 伺服器   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人
Go 基本簡介  Go 語言誕生  Go 語言優勢  Go 語言選擇  誰在用 Go 語言
Robert Griesemer, Rob Pike 和 Ken Thompson
Go 發布週期(半年一版)   2013/05 1.1   2013/12 1.2   2014/06 1.3   2014/12 1.4   2015/08 1.5 (Google 規定以後每半年發佈一版)   2016/02 1.6   2016/08 1.7   2017/02 1.8
為什麼設計 Go 語言
Google 遇到的問題   大量的 C++ 代码,同時引入 Java 和 Python   成千上萬的工程师   數百萬的程式碼   分散式編譯系統   數百萬的伺服器
Google 痛點   編譯非常慢   沒用的相依性檔案   工程師只用了一個語言一小部分   程式碼難以維護 (可讀性差,⽂文件不清楚)   部署時間越來越長   交叉編譯困難
Go 語言特性   沒有物件導向 (無繼承特性)   強制類型   Function 和 Method   没有錯誤處理   ⽤用字⾸首來區別可否存取   不⽤用的 Import 或變數會引起編譯錯誤   完整的標準函式   支援 UTF-8 格式
Go at Google: Language Design in the Service of Software Engineering https://talks.golang.org/2012/splash.article
為什麼要導入 Go 語言 Team work
Go 帶給團隊優勢   學習曲線   開發及執行效率   由 Google 維護   部署方便   跨平台編譯   內建 Coding Style, Testing 等工具   多核心處理
誰在用 Go 語言
Go 大型專案https://github.com/golang/go/wiki/Projects
Why Gohttps://github.com/golang/go/wiki/whygo
Switched from other languages. PHP, Python, Node.js, Java, C++ https://github.com/golang/go/wiki/FromXToGo
如何將 Go 語言導入團隊
  學習曲線   程式碼簡潔   沒有物件導向   團隊開發工具整合   Coding Style   Testing Tool   Benchmark Tool   性能分析   部署環境   降低部署時間   降低測試時間   重啟時間非常快,Load-Balancer 不需要 Pre-warning   系統效能 (記憶體用量, CPU 使用率 …)   EC2 使用量降低
A push notification server written in Go https://github.com/appleboy/gorush/
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go concurrency 介紹   Go 簡易 HTTP 伺服器   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人
安裝 Go 環境 請直接安裝 Go Version Manager https://github.com/moovweb/gvm
安裝步驟 gvm install go1.4 -B gvm use go1.4  export GOROOT_BOOTSTRAP=$GOROOT gvm install go1.8
請在終端機執行 go env
修改 GOPATH 路徑 export GOPATH=/Users/appleboy/git/go 注意: Go 1.8 之後已經預設將 GOPATH 設定在 ${HOME}/go 路徑
GOPATH ⺫⽬目錄局結構  bin  編譯後產生可執行檔案 src  存放程式碼 pkg  放置編譯後的 .a 檔案
Go 指令介紹   go get   go run   go test   go fmt   go install   go build   go doc
在本機端看 Go 文件 godoc –http=:8088
Go 程式碼品質
gofmthttps://blog.golang.org/go-fmt-your-code
gofmt   程式碼自動化排版   整合各大編輯器 (Atom, Sublime, VS code, Vim .. 等)   重構程式碼
golinthttps://github.com/golang/lint
golint   變數命名方式   確保文件撰寫
Go 編輯器 Visual Studio Code https://code.visualstudio.com
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go 套件製作   Go concurrency 介紹   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人
Import 可以使用別名 可以省略引用
Import 順序  內建 Package  自建 Package  外部 Package
Package 用大小寫決定 使用權限
大小寫區別 Private 及 Public
變數宣告 const, var, :=
變數宣告   使用 const   使用 := (常用)   使用 var
const使用 iota
if 條件子句
if 條件子句   右括號必須跟 if 或 else 同一行   支援私有變數,只在 if 內使用
switch   不需要寫 break fallthrough 可以繼續執⾏行下⼀一個 case
Array, Slice
Functions
function   Return   Return naming   Return multiple
作業   請寫出一個 func 加總所有輸入值及平均值 Func(4,6) = 10, 5 Func(4,6,10) = 20, 6.66   請忽略負數值 Func(4, -2, 100) = 104, 34
Variadic Functions Go func 不提供預設值
Structs, Methods
作業   實作計算機功能   初始值 New(int)   加法 func Add(input …int)   減法 func Sub(input …int)   輸出
Interface
作業   實作兩台計算機功能   初始值(一台為 100, 一台為 200)   加法(一台 * 2, 一台 * 3)   減法(一台 * 2, 一台 * 4)   輸出   Add(100,200,300)   Sub(50, 60)   計算機 1: 輸出為 1080   計算機 2: 輸出為 1560
Type assertion and type switch Interface
作業   請用單一 func 實作底下功能   輸入數字 100 轉換成字串 100   輸入字串 100 轉換成數字 100
init function
錯誤處理 Error Handling https://golang.org/pkg/errors/
錯誤處理  errors.New  fmt.Errorf
自訂錯誤 Error() string https://blog.golang.org/error-handling-and-go
作業   撰寫底下 func 功能   輸入數字小於 10 則回傳錯誤   自訂錯誤輸入訊息   您的輸入 %d 小於 10
Vendor 管理
請直接安裝 Package Management Tools https://github.com/golang/go/wiki/PackageManagementTools
推薦套件 govendor https://github.com/kardianos/govendor
Go 也想統一 dependency tool https://github.com/golang/dep
寫測試Go 內建測試 Tool
測試完整 package go test -v -cover -coverprofile=coverage.txt ./…
測試單一函數go test -v -cover -run=TestHelloWorld ./example/…
測試覆蓋率報表 go tool cover -html=coverage.txt
作業   請將前面作業補上基本測試,覆蓋率達 80 %
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go concurrency 介紹   Go 簡易 HTTP 伺服器   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人
Go supports concurrency   concurrent execution (goroutines)   synchronization and messaging (channels)   multi-way concurrent control (select)
Concurrency vs. Parallelism https://blog.golang.org/concurrency-is-not-parallelism
ChannelBlocking vs Non-Blocking
sync.WaitGroup
Select
作業   建立兩個 Channel errChannel := make(chan error, 1)   finished := make(chan bool, 1)   用 For 跑 10 個 Job   其中第五個 Job 回傳 err chan 後結束程式   跑完 10 個 Job 則回傳 finished chan 後結束程式   用 sync.WaitGroup 實現
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go Concurrency 介紹   Go 簡易 HTTP 伺服器   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人
Web Clientshttps://golang.org/pkg/net/http#Client https://golang.org/pkg/net/http#Request https://golang.org/pkg/net/http#Response
Web Servershttp.ListenAndServe
HandleFunc
NewServeMux & ServeHTTP
自訂 Http.Server
作業   撰寫 Http Server Listen on 8088 port   /hello 輸出 Hello Golang
Go 1.8 Closed Server os.Signal
選擇 Web Framework https://awesome-go.com/#web-frameworks
Gin, Beego, Echo …
豐富的 Middleware https://github.com/gin-contrib
快速寫 Web Testing https://github.com/appleboy/gofight https://awesome-go.com/#testing
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go concurrency 介紹   Go 簡易 HTTP 伺服器   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人
flag packagehttps://golang.org/pkg/flag
flag package 不支援環境變數 os.Getenv()
urfave/clihttps://github.com/urfave/cli https://blog.wu-boy.com/2017/02/write-command-line-in-golang/
https://github.com/spf13/cobra
跨平台編譯 GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o hello package GOOS=linux GOARCH=arm CGO_ENABLED=0 go build -o hello package GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o hello package GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -o hello.exe package
Go cross compile tool https://github.com/mitchellh/gox
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go concurrency 介紹   Go 簡易 HTTP 伺服器   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人
Docker Image docker build -t example-alpine -f Dockerfile.golang .
Alpine Linux 挑戰最小 docker image OS https://goo.gl/bLd9FA
golang:1.8.0-alpine
更小 scratch
x509: failed to load system roots and no roots provided
centurylink/ca-certs
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go concurrency 介紹   Go 簡易 HTTP 伺服器   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人
Downsize go binary? Go 1.5
Using shared library in Go this feature is available on linux/amd64 platform
Compile standard builtin packages go install -buildmode=shared -linkshared std
Compile your share library go install -buildmode=shared –linkshared calc
Using shared Go library in C
Go functions can be executed from C applications. //export <your_function_name> go build -buildmode=c-shared –o hello.so hello.go
buildmode=plugin go build -buildmode=plugin -o hello.so hello.go Go 1.8 feature
Using C Library in Go
課程大綱   Go 基本簡介   Go 環境建置   Go 基本語法   Go concurrency 介紹   Go 簡易 HTTP 伺服器   Go 簡易 Command Line 實作   Go 搭配 Docker 介紹   Go 結合 C 語⾔言   Go 實作 Line, Facebook 機器人 (作業)
Bot 機器人   Slack   Facebook   Line   Telegram
作業   整合 Go Cli Tool:   ./main server 用來接受 fb 或 line callback   ./main send 用來傳送訊息給單一使用者   ./main send -u user -m message

Introduction to Golang final