Upload
paul-chao
View
362
Download
7
Embed Size (px)
Citation preview
一天學會 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 大型專案
Why Go https://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 程式碼品質
gofmt https://blog.golang.org/go-fmt-your-code
gofmt
程式碼自動化排版
整合各大編輯器 (Atom, Sublime, VS code, Vim .. 等)
重構程式碼
golint https://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
寫測試 Go 內建測試 Tool
測試完整 package go test -v -cover ./…
測試單一函數 go test -v -cover -run=TestHelloWorld ./example/…
測試覆蓋率報表 go tool cover -html=coverage.txt
變數宣告 const, var, :=
變數宣告
使用 const
使用 := (常用)
使用 var
if 條件子句
if 條件子句
右括號必須跟 if 或 else 同一行
支援私有變數,只在 if 內使用
switch
不需要寫 break
fallthrough 可以繼續執⾏行下⼀一個 case
錯誤處理 Error Handling
https://golang.org/pkg/errors/
錯誤處理
errors.New
fmt.Errorf
自訂錯誤 Error() string
Array
Functions return multiple value
Variadic Functions …type
Structs, Methods
Type assertion and type switch Interface
init function
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 基本簡介
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
sync.WaitGroup
Channel
課程大綱 Go 基本簡介
Go 環境建置
Go 基本語法
Go Concurrency 介紹
Go 簡易 HTTP 伺服器
Go 簡易 Command Line 實作
Go 搭配 Docker 介紹
Go 結合 C 語⾔言
Go 實作 Line, Facebook 機器人
Web Clients https://golang.org/pkg/net/http#Client
https://golang.org/pkg/net/http#Request https://golang.org/pkg/net/http#Response
Web Servers http.ListenAndServe
選擇 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 package https://golang.org/pkg/flag
flag package 不支援環境變數 os.Getenv()
urfave/cli https://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
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 機器人