122
一天學會 Go 語言 2017.03.18 吳柏毅 Bo-Yi Wu

Let's Go! 一天就上手 : 體驗Go語言基礎班

Embed Size (px)

Citation preview

Page 1: Let's Go! 一天就上手 : 體驗Go語言基礎班

一天學會 Go 語言 2017.03.18

吳柏毅 Bo-Yi Wu

Page 2: Let's Go! 一天就上手 : 體驗Go語言基礎班

  Blog: https://blog.wu-boy.com/

GitHub: http://github.com/appleboy

  Slide: https://www.slideshare.net/appleboy

Page 3: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go concurrency 介紹

  Go 簡易 HTTP 伺服器

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人

Page 4: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go concurrency 介紹

  Go 簡易 HTTP 伺服器

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人

Page 5: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go 基本簡介

 Go 語言誕生

 Go 語言優勢

 Go 語言選擇

 誰在用 Go 語言

Page 6: Let's Go! 一天就上手 : 體驗Go語言基礎班

Robert Griesemer, Rob Pike 和 Ken Thompson

Page 7: Let's Go! 一天就上手 : 體驗Go語言基礎班

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

Page 8: Let's Go! 一天就上手 : 體驗Go語言基礎班

為什麼設計 Go 語言

Page 9: Let's Go! 一天就上手 : 體驗Go語言基礎班

Google 遇到的問題

  大量的 C++ 代码,同時引入 Java 和 Python

  成千上萬的工程师

  數百萬的程式碼

  分散式編譯系統

  數百萬的伺服器

Page 10: Let's Go! 一天就上手 : 體驗Go語言基礎班

Google 痛點

  編譯非常慢

  沒用的相依性檔案

  工程師只用了一個語言一小部分

  程式碼難以維護 (可讀性差,⽂文件不清楚)

  部署時間越來越長

  交叉編譯困難

Page 11: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go 語言特性   沒有物件導向 (無繼承特性)

  強制類型

  Function 和 Method

  没有錯誤處理

  ⽤用字⾸首來區別可否存取

  不⽤用的 Import 或變數會引起編譯錯誤

  完整的標準函式

  支援 UTF-8 格式

Page 12: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go at Google: Language Design in the Service of Software Engineering

https://talks.golang.org/2012/splash.article

Page 13: Let's Go! 一天就上手 : 體驗Go語言基礎班

為什麼要導入 Go 語言 Team work

Page 14: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go 帶給團隊優勢

 學習曲線

 開發及執行效率

 由 Google 維護

 部署方便

 跨平台編譯

 內建 Coding Style, Testing 等工具

 多核心處理

Page 15: Let's Go! 一天就上手 : 體驗Go語言基礎班

誰在用 Go 語言

Page 16: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 17: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go 大型專案

Page 18: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 19: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 20: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 21: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 22: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 23: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 24: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 25: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 26: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 27: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 28: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 29: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 30: Let's Go! 一天就上手 : 體驗Go語言基礎班

Why Go https://github.com/golang/go/wiki/whygo

Page 31: Let's Go! 一天就上手 : 體驗Go語言基礎班

Switched from other languages. PHP, Python, Node.js, Java, C++

https://github.com/golang/go/wiki/FromXToGo

Page 32: Let's Go! 一天就上手 : 體驗Go語言基礎班

如何將 Go 語言導入團隊

Page 33: Let's Go! 一天就上手 : 體驗Go語言基礎班

  學習曲線   程式碼簡潔

  沒有物件導向

  團隊開發工具整合   Coding Style

  Testing Tool

  Benchmark Tool

  性能分析

  部署環境   降低部署時間

  降低測試時間

  重啟時間非常快,Load-Balancer 不需要 Pre-warning

  系統效能 (記憶體用量, CPU 使用率 …)   EC2 使用量降低

Page 34: Let's Go! 一天就上手 : 體驗Go語言基礎班

A push notification server written in Go

https://github.com/appleboy/gorush/

Page 35: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go concurrency 介紹

  Go 簡易 HTTP 伺服器

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人

Page 36: Let's Go! 一天就上手 : 體驗Go語言基礎班

安裝 Go 環境 請直接安裝 Go Version Manager

https://github.com/moovweb/gvm

Page 37: Let's Go! 一天就上手 : 體驗Go語言基礎班

安裝步驟

gvm install go1.4 -B

gvm use go1.4

 export GOROOT_BOOTSTRAP=$GOROOT

gvm install go1.8

Page 38: Let's Go! 一天就上手 : 體驗Go語言基礎班

請在終端機執行 go env

Page 39: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 40: Let's Go! 一天就上手 : 體驗Go語言基礎班

修改 GOPATH 路徑

export GOPATH=/Users/appleboy/git/go 注意: Go 1.8 之後已經預設將 GOPATH 設定在 ${HOME}/go 路徑

Page 41: Let's Go! 一天就上手 : 體驗Go語言基礎班

GOPATH ⺫⽬目錄局結構

 bin  編譯後產生可執行檔案

src  存放程式碼

pkg  放置編譯後的 .a 檔案

Page 42: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 43: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go 指令介紹

  go get

  go run

  go test

  go fmt

  go install

  go build

  go doc

Page 44: Let's Go! 一天就上手 : 體驗Go語言基礎班

在本機端看 Go 文件 godoc –http=:8088

Page 45: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go 程式碼品質

Page 46: Let's Go! 一天就上手 : 體驗Go語言基礎班

gofmt https://blog.golang.org/go-fmt-your-code

Page 47: Let's Go! 一天就上手 : 體驗Go語言基礎班

gofmt

 程式碼自動化排版

 整合各大編輯器 (Atom, Sublime, VS code, Vim .. 等)

 重構程式碼

Page 48: Let's Go! 一天就上手 : 體驗Go語言基礎班

golint https://github.com/golang/lint

Page 49: Let's Go! 一天就上手 : 體驗Go語言基礎班

golint

  變數命名方式

  確保文件撰寫

Page 50: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go 編輯器 Visual Studio Code

https://code.visualstudio.com

Page 51: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go 套件製作

  Go concurrency 介紹

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人

Page 52: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 53: Let's Go! 一天就上手 : 體驗Go語言基礎班

Import 可以使用別名 可以省略引用

Page 54: Let's Go! 一天就上手 : 體驗Go語言基礎班

Import 順序

 內建 Package

 自建 Package

 外部 Package

Page 55: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 56: Let's Go! 一天就上手 : 體驗Go語言基礎班

Package 用大小寫決定

使用權限

Page 57: Let's Go! 一天就上手 : 體驗Go語言基礎班

大小寫區別 Private 及 Public

Page 58: Let's Go! 一天就上手 : 體驗Go語言基礎班

寫測試 Go 內建測試 Tool

Page 59: Let's Go! 一天就上手 : 體驗Go語言基礎班

測試完整 package go test -v -cover ./…

Page 60: Let's Go! 一天就上手 : 體驗Go語言基礎班

測試單一函數 go test -v -cover -run=TestHelloWorld ./example/…

Page 61: Let's Go! 一天就上手 : 體驗Go語言基礎班

測試覆蓋率報表 go tool cover -html=coverage.txt

Page 62: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 63: Let's Go! 一天就上手 : 體驗Go語言基礎班

變數宣告 const, var, :=

Page 64: Let's Go! 一天就上手 : 體驗Go語言基礎班

變數宣告

  使用 const

  使用 := (常用)

  使用 var

Page 65: Let's Go! 一天就上手 : 體驗Go語言基礎班

if 條件子句

Page 66: Let's Go! 一天就上手 : 體驗Go語言基礎班

if 條件子句

  右括號必須跟 if 或 else 同一行

  支援私有變數,只在 if 內使用

Page 67: Let's Go! 一天就上手 : 體驗Go語言基礎班

switch

  不需要寫 break

fallthrough 可以繼續執⾏行下⼀一個 case

Page 68: Let's Go! 一天就上手 : 體驗Go語言基礎班

錯誤處理 Error Handling

https://golang.org/pkg/errors/

Page 69: Let's Go! 一天就上手 : 體驗Go語言基礎班

錯誤處理

  errors.New

  fmt.Errorf

Page 70: Let's Go! 一天就上手 : 體驗Go語言基礎班

自訂錯誤 Error() string

Page 71: Let's Go! 一天就上手 : 體驗Go語言基礎班

Array

Page 72: Let's Go! 一天就上手 : 體驗Go語言基礎班

Functions return multiple value

Page 73: Let's Go! 一天就上手 : 體驗Go語言基礎班

Variadic Functions …type

Page 74: Let's Go! 一天就上手 : 體驗Go語言基礎班

Structs, Methods

Page 75: Let's Go! 一天就上手 : 體驗Go語言基礎班

Type assertion and type switch Interface

Page 76: Let's Go! 一天就上手 : 體驗Go語言基礎班

init function

Page 77: Let's Go! 一天就上手 : 體驗Go語言基礎班

Vendor 管理

Page 78: Let's Go! 一天就上手 : 體驗Go語言基礎班

請直接安裝 Package Management Tools

https://github.com/golang/go/wiki/PackageManagementTools

Page 79: Let's Go! 一天就上手 : 體驗Go語言基礎班

推薦套件 govendor https://github.com/kardianos/govendor

Page 80: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go 也想統一 dependency tool https://github.com/golang/dep

Page 81: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go concurrency 介紹

  Go 簡易 HTTP 伺服器

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人

Page 82: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go supports concurrency

  concurrent execution (goroutines)

  synchronization and messaging (channels)

  multi-way concurrent control (select)

Page 83: Let's Go! 一天就上手 : 體驗Go語言基礎班

Concurrency vs. Parallelism https://blog.golang.org/concurrency-is-not-parallelism

Page 84: Let's Go! 一天就上手 : 體驗Go語言基礎班

sync.WaitGroup

Page 85: Let's Go! 一天就上手 : 體驗Go語言基礎班

Channel

Page 86: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go Concurrency 介紹

  Go 簡易 HTTP 伺服器

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人

Page 87: Let's Go! 一天就上手 : 體驗Go語言基礎班

Web Clients https://golang.org/pkg/net/http#Client

https://golang.org/pkg/net/http#Request https://golang.org/pkg/net/http#Response

Page 88: Let's Go! 一天就上手 : 體驗Go語言基礎班

Web Servers http.ListenAndServe

Page 89: Let's Go! 一天就上手 : 體驗Go語言基礎班

選擇 Web Framework https://awesome-go.com/#web-frameworks

Page 90: Let's Go! 一天就上手 : 體驗Go語言基礎班

Gin, Beego, Echo …

Page 91: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 92: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 93: Let's Go! 一天就上手 : 體驗Go語言基礎班

豐富的 Middleware https://github.com/gin-contrib

Page 94: Let's Go! 一天就上手 : 體驗Go語言基礎班

快速寫 Web Testing https://github.com/appleboy/gofight

https://awesome-go.com/#testing

Page 95: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 96: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go concurrency 介紹

  Go 簡易 HTTP 伺服器

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人

Page 97: Let's Go! 一天就上手 : 體驗Go語言基礎班

flag package https://golang.org/pkg/flag

Page 98: Let's Go! 一天就上手 : 體驗Go語言基礎班

flag package 不支援環境變數 os.Getenv()

Page 99: Let's Go! 一天就上手 : 體驗Go語言基礎班

urfave/cli https://github.com/urfave/cli

https://blog.wu-boy.com/2017/02/write-command-line-in-golang/

Page 100: Let's Go! 一天就上手 : 體驗Go語言基礎班

https://github.com/spf13/cobra

Page 101: Let's Go! 一天就上手 : 體驗Go語言基礎班

跨平台編譯 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

Page 102: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go cross compile tool https://github.com/mitchellh/gox

Page 103: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 104: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go concurrency 介紹

  Go 簡易 HTTP 伺服器

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人

Page 105: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 106: Let's Go! 一天就上手 : 體驗Go語言基礎班

Docker Image docker build -t example-alpine -f Dockerfile.golang .

Page 107: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 108: Let's Go! 一天就上手 : 體驗Go語言基礎班

Alpine Linux 挑戰最小 docker image OS

https://goo.gl/bLd9FA

Page 109: Let's Go! 一天就上手 : 體驗Go語言基礎班

golang:1.8.0-alpine

Page 110: Let's Go! 一天就上手 : 體驗Go語言基礎班
Page 111: Let's Go! 一天就上手 : 體驗Go語言基礎班

x509: failed to load system roots and no roots provided

Page 112: Let's Go! 一天就上手 : 體驗Go語言基礎班

centurylink/ca-certs

Page 113: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go concurrency 介紹

  Go 簡易 HTTP 伺服器

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人

Page 114: Let's Go! 一天就上手 : 體驗Go語言基礎班

Downsize go binary? Go 1.5

Page 115: Let's Go! 一天就上手 : 體驗Go語言基礎班

Using shared library in Go this feature is available on linux/amd64 platform

Page 116: Let's Go! 一天就上手 : 體驗Go語言基礎班

Compile standard builtin packages go install -buildmode=shared -linkshared std

Page 117: Let's Go! 一天就上手 : 體驗Go語言基礎班

Compile your share library go install -buildmode=shared –linkshared calc

Page 118: Let's Go! 一天就上手 : 體驗Go語言基礎班

Using shared Go library in C

Page 119: Let's Go! 一天就上手 : 體驗Go語言基礎班

Go functions can be executed from C applications.

//export <your_function_name> go build -buildmode=c-shared –o hello.so hello.go

Page 120: Let's Go! 一天就上手 : 體驗Go語言基礎班

buildmode=plugin go build -buildmode=plugin -o hello.so hello.go

Go 1.8 feature

Page 121: Let's Go! 一天就上手 : 體驗Go語言基礎班

Using C Library in Go

Page 122: Let's Go! 一天就上手 : 體驗Go語言基礎班

課程大綱   Go 基本簡介

  Go 環境建置

  Go 基本語法

  Go concurrency 介紹

  Go 簡易 HTTP 伺服器

  Go 簡易 Command Line 實作

  Go 搭配 Docker 介紹

  Go 結合 C 語⾔言

  Go 實作 Line, Facebook 機器人