
vscode 編輯器只需要安裝 Go plugin
GOPATH 目錄底下結構
學習底下指令用法
很多朋友剛入門 Go 語言時,第一個會遇到的問題是,該如何設定專案配置,讓專案可以正常執行,在個人電腦該如何開發多個專案,這邊就會遇到該如何設定 $GOPATH,我在這邊跟大家講個觀念,開發環境只會有一個 $GOPATH,不管團隊內有多少專案,都是存放在同一個 GOPATH,避免每次開專案都要重新設定 $GOPATH,而專案內用到的相依性套件,請各自維護,透過官方提供的 wiki,請選一套覺得好用的來使用吧,沒有最好的工具,找一套適合團隊是最重要的。
舊專案內 vendor 轉換成 go module 設定
新專案如何啟用 go module
在 Travis CI 或 Drone 如何使用 go module
在開源專案內並存 vendor 及 go module
Go Module 是 Golang 推出的一套件管理系統,在 Go 1.11 推出後,許多 Package 也都陸續支援 Go Module 取代舊有的套件管理系統,像是 govendor 或 dep 等,而再過不久之後,保留 vendor 的方式也會被移除,畢竟現在開發已經不需要在 GOPATH 目錄底下了。對於 Go Module 不熟的話,建議先看官方今年寫的一篇教學部落格,底下是教學會涵蓋的範圍
* Creating a new module.
* Adding a dependency.
* Upgrading dependencies.
* Adding a dependency on a new major version.
* Upgrading a dependency to a new major version.
* Removing unused dependencies.
而本篇最主要會跟大家探討如何發佈 v2 以上的套件版本。
介紹如何開啟新專案撰寫第一個 Hello World 主程式
介紹如何撰寫專案的 Package 並且該如何引用 (三種引用特性)
介紹三種 Go 的變數宣告方式
此章節會教大家撰寫基本的 go func 跟使用技巧
此章節教大家在 Go 語言內如何處理錯誤訊息。兩種方式可以回傳錯誤
假設有個 func 是用來判斷使用者帳號是否存在於資料庫,那該如何定義錯誤型態 (使用者已存在就回傳錯誤)。
在寫 func 時,如果參數型態是 Slice,這時候是會把 Slice 第一個內容位址傳入,所以假設在 Function 內修正該值,則會影響 main 函數內的變數,這邊需要大家注意。
本講座會簡單說明如何使用 switch case,並且告知大家請勿大量使用 if else if 的寫法,取而代之的是 switch
Go 語言的特性 init func 可以讓開發者在多個 package 內定義自己的 init func,那該如何使用了?
在 Struct Method 內,許多人不知道底下兩種寫法的差異,這堂課會交給大家 pointers vs values 的差異性,以及使用上面該注意的 race condition。
func (e Email) Test {}
func (e *Email) Test {}
為什麼我會選用 Go 語言,其中一個很著要原因是,在 Go 語言寫測試實在太簡單了,Go 語言內建基本的測試套件,讓開發者可以不用引入第三方套件就可以輕易寫測試,另外寫測試的好處可以讓團隊減少技術債。
此教學會帶給大家三大部分
本堂課透過 PHP 實際案例來學習 Go 語言 Interface
PHP Interface Class 轉 Golang Struct
使用 Interface 為函數參數 (fmt 的 Stringer Interface)
儲存變數類型
本單元會介紹兩套驗證程式碼品質的工具及服務,希望對於大型專案會有幫助
1. https://golangci.com/
2. https://go-critic.github.io/overview
在現代開發專案時,一定會用到環境變數,像是讀取 AWS Secret Key 等等,在部署上面也會透過設定變數讓專案依據不同環境讀取不同環境變數,在 Go 語言內如何實現讀取環境變數,又可以讓開發者透過 .env 檔案動態改變環境變數,本影片用簡單的套件來實現。這個在其他語言的 Framework 都有實現,像是 Laravel 的 .env 設定
Go 語言除了內建強大的測試工具 (go test) 之外,也提供了效能評估的工具 (go tool pprof),整個生態鏈非常完整,這也是我推薦大家使用 Go 語言的最大原因,這篇會介紹如何使用 pprof 來找出效能瓶頸的地方。假設開發者在寫任何邏輯功能時,發現跑出來的速度不是想像的這麼快,或者是在串接服務流程時,整個回覆時間特別久,這時候可以透過 benchmark 先找出原因。
此影片會教底下內容:
project layout 基本簡介
為什麼要用 go module
使用 makefile
.env 使用情境
如何設定專案版本資訊
Go 語言在 1.11 推出 go module 來統一市面上不同管理 Go 套件的工具,像是 dep 或 govendor 等,還不知道如何使用 go module,可以參考之前寫的一篇文章『Go Module 導入到專案內且搭配 Travis CI 或 Drone 工具』,在團隊內如果每個人在開發專案時,都透過網路去下載專案使用到的套件,這樣 10 個人就會浪費 10 個人的下載時間,並且佔用公司網路頻寬,所以我建議在公司內部架設一台 Go Proxy 服務,減少團隊在初始化專案所需要的時間,也可以減少在跑 CI/CD 流程時,所需要花費的時間,測試過公司 CI/CD 流程,有架設 Go Proxy,一般來說可以省下 1 ~ 2 分鐘時間,根據專案使用到的相依性套件用量來決定花費時間。本篇來介紹如何架設 ATHENS 這套開源 Go Proxy 專案。
如何將比較繁瑣的程式邏輯丟到背景執行,這時候就需要用到 Go 語言關鍵字 go
當專案有三個 Job 同時執行,該如何透過 sync.WaitGroup 方式來等待所有 Job 處理完畢才繼續執行
五分鐘可以簡單了解 Go 語言重大特性 go channel 的兩種特性 buffered vs unbuffered,影片內用簡單的例子來介紹 channel,希望大家會喜歡
本課程直接用一個實際案例來帶大家了解如何使用 multiple channel,我們先來看看案例題目『透過 goroutine 跑 20 個 JOB』裡面需要實作底下項目:
* 使用 outChan 顯示各個 JOB 完成狀況
* 使用 errChan 顯示 JOB 發生錯誤並且跳出 main 主程式
* 使用 finishChan 通知全部 JOB 已經完成
* 設定 Timeout 機制 (1 秒之內要完成所有 job)
Select 四大用法
Random value
Timeout 超時機制
Check buffer channel is full
Breaking for loop channel
相信不少開發者肯定聽過 Go 語言之所以讓人非常喜歡,就是因為 Go concurrency,如果您對於 concurrency 不了解的朋友們,可以直接參考官網的範例開始了解,範例會帶您一步一步了解什麼是 Channel 什麼是 Go concurrency?本篇會介紹 Channel 使用時機,在大部分寫 application 時,老實說很少用到 Channel,所以很多人其實不知道該在哪種場景需要使用 Channel,底下這句名言大家肯定聽過:
Do not communicate by sharing memory; instead, share memory by communicating.
本篇會用簡單的例子來帶大家理解上述名言
我們該如何升級 Web 服務,你會說很簡單啊,只要關閉服務,上程式碼,再開啟服務即可,可是很多時候開發者可能沒有想到現在服務上面是否有正在處理的資料,像是購物車交易?也或者是說背景有正在處理重要的事情,如果強制關閉服務,就會造成下次啟動時會有一些資料上的差異,那該如何優雅地關閉服務,這就是本篇的重點了。
上一篇作者有提到『什麼是 graceful shutdown?』,本篇透過 docker-compose 方式來驗證 Go 語言的 graceful shutdown 是否可以正常運作。除了驗證之外,單機版 Docker 本身就可以設定 scale 容器數量,那這時候又該如何搭配 graceful shutdown 來實現 rolling update 呢?相信大家對於 rolling update 並不陌生,現在的 kubernetes 已經有實現這個功能,用簡單的指令就可以達到此需求,但是對於沒有在用 k8s 架構的開發者,可能網站也不大,那該如何透過單機本的 docker 來實現呢?
在閱讀本文章之前,作者有寫過一篇『graceful shutdown with multiple workers』此篇文章介紹了可以在服務停止前做一些正確的 Shutdown 流程,像是處理 Http Handler 或關閉資料庫連線等等,假設有服務內有實作 Worker 處裡多個 Job,那該如何等到全部的 Job 都執行完畢才正確關閉且刪除服務 (使用 Docker) 呢?
相信大家踏入 Go 語言的世界,肯定是被強大的 Concurrency 所吸引,Go 語言用最簡單的關鍵字 go 就可以將任務丟到背景處理,但是開發者開怎麼有效率的控制 Concurrency,這是入門 Go 語言必學的項目,本篇會介紹三種方式來帶大家認識 Concurrency,而這三種方式分別對應到三個不同的名詞: WaitGroup, Channel, 及 Context,底下用簡單的範例帶大家了解。
最近看到一篇文章討論的非常熱烈,就是『concurrency is still not easy』這篇文章甚至上了 Hack News,大家有興趣可以點進去看看,而本篇會用一個實際案例介紹為什麼作者會說寫 Concurrency 不是這麼容易。大家都知道在 Go 語言內,要寫 Concurrency 只要透過一個關鍵字 go 就可以輕易寫出,而多個 Goroutine 要溝通就是需要透過 Channel 方式,而網路上有一堆 Concurrency Pattern 提供給各位開發者,但是官方 Go 的標準庫內並沒有包含這些 Pattern,所以實作之後,說實在很難看出問題。文章內提到 gops 實作 Limit Concurrency 遇到系統整個 hang 住的問題?什麼是 Limit Concurrency,就是當系統有多個工作需要同時執行,但是需要限制 Concurrency 數量,避免整個資源都被吃光。底下來介紹文章內遇到的問題。
MongoDB 是一套具有高效能讀寫的 NoSQL 資料庫,但是不像傳統關連式資料庫,有非常好用的 Transaction 交易模式,而在 MongoDB 也可以透過 Two Phase Commits 來達成交易功能,大家可以先打開文件看看,非常冗長,工程師需要花很多時間閱讀文件並且實現出來。而在 Go 語言內,我們可以在 Single Thread 內同一時間點讀寫存取同一筆資料庫來解決此問題
第一種就是透過 sync.Mutex 方式,直接將交易區段程式碼 lock 住,這樣可以避免同時寫入或讀出的問題
假設我們有 100 個帳號,開 10 個 Queue 去處理,每一個 Queue 來處理 10 個帳號,也就是說 ID 為 23 號的分給第 3 (23 % 10) 個 Queue,ID 為 59 號則分給第 9 個 Queue。
假設需要擴展服務,執行超過一個服務,就會遇到 Optimistic concurrency control,原因在上述方法只能保證在單一服務內不會同時存取同一筆資料,但是如果是多個服務則還是會發生同時存取或寫入單筆資料。這邊可以用簡單的機制來解決應用層的問題,直接在資料表加上 Version,初始值為 1
這系列課程您會學到如下:
什麼是 Facebook Account Kit?
傳統 Restful API 優缺點
什麼是 GraphQL 及為什麼要使用 GraphQL
GraphQL 在 Golang 內的 Framework 比較
實作 Gin + GraphQL 取代傳統 Restful API
搭配 Facebook Account Kit 認證
實作 GraphQL 測試
此章節說明 Restful API 在前後端團隊合作上面有哪些缺陷,其中兩項一般來說大家都會遇到
1. 不同裝置需要不同欄位,像是 mobile 或平板畫面配置都會不同,會造成後端邏輯變得複雜
2. 後端線上文件都是由後端自動產生出來,但是在專案趕的時候,工程師就會忘記寫文件,造成文件 Out of Date,久而久之工程師再也不寫了,前後端溝通成本就提高了。
相信各位開發者對於 GraphQL 帶來的好處已經非常清楚,如果對 GraphQL 很陌生的朋友們,可以直接參考之前作者寫的一篇『Go 語言實戰 GraphQL』,內容會講到用 Go 語言實戰 GraphQL 架構,教開發者如何撰寫 GraphQL 測試及一些開發小技巧,不過內容都是以 graphql-go 框架為主。而本篇主題會講為什麼我從 graphql-go 框架轉換到 gqlgen。
不久之前寫過一篇『從 graphql-go 轉換到 gqlgen』,目前團隊舊有的專案還是繼續用 graphql-go 來撰寫,不過之後需求量越來越大,維護 graphql-go 就越來越困難,故有在想怎麼把 gqlgen 跟 graphql-go 相容在一起,那就是把這兩個套件想成不同的服務,再透過 Gateway 方式完成 single data graph。至於怎麼選擇 GraphQL Gateway 套件,最容易的方式就是使用 @apollo/gateway,但是由於個人比較偏好 Go 語言的解決方案,就稍微找看看有無人用 Go 實現了 Gateway,後來找到 nautilus/gateway,官方有提供文件以及教學 Blog 可以供開發者參考。底下會教大家使用 nautilus/gateway 將兩個不同的服務串接在一起。
GitHub Actions 也推出一陣子了,本篇要來介紹如何透過 GitHub Actions 來部署 Go 語言服務,會用一個簡單 http 範例教大家如何透過 Docker 方式來更新。Go 語言基本服務流程大致上會是『測試 -> 編譯 -> 上傳 -> 啟動』,透過這四個步驟來學習 GitHub Actions 該如何設定。
測試: Unit Testing 多一層保護
編譯: 透過 go build 編譯出 Binary 檔案
上傳: 寫 Dockerfile 將 Binary 包進容器內
啟動: 透過 docker-compose 方式來更新服務
重要提醒:因此平台 Udemy 為境外公司,在 Udemy 的刷卡屬於境外刷卡,您的信用卡公司會另外向您收取大約 1.5% 的國外交易手續費。手續費根據各家信用卡公司規定有所不同,詳細數字需與您的發卡銀行確認。
Go 語言 (又稱 Golang) 是 Google 推出新一代的強大語言,2018 年 1 月 Google 公佈了去年底統計的問卷結果,發現 61% 用 Go 來寫網站,37% 用來開發系統程式,36% 用來做 DevOps (多重選擇),可想而知 Go 語言可以拿來從底層寫到上層。高效能的 Goroutine (併發) 表現優於 Parallelism (並行),語法上簡潔又簡單,這也就是為什麼我們要來嘗試 Go 語言。
課程大綱
Go 背景介紹
Go 環境建置
Go 基本語法
Go Goroutines 介紹
Go Channel 介紹
Go 簡易 HTTP 伺服器
Go 簡易 Command Line 實作
Go 跨平台編譯 (Windows, MacOS, Linux)
Go 搭配 Docker 介紹
Go 語言開發實戰案例
Go 語言專案搭配 Drone 持續整合測試部署
Go 實戰 GraphQL 語言
Go 部署到 Heroku 平台