Go 語言的 vendor 目錄

cover

很多朋友剛入門 Go 語言時,第一個會遇到的問題是,該如何設定專案配置,讓專案可以正常執行,在個人電腦該如何開發多個專案,這邊就會遇到該如何設定 $GOPATH,我在這邊跟大家講個觀念,開發環境只會有一個 $GOPATH,不管團隊內有多少專案,都是存放在同一個 GOPATH,避免每次開專案都要重新設定 $GOPATH,而專案內用到的相依性套件,請各自維護,透過官方提供的 wiki,請選一套覺得好用的來使用吧,沒有最好的工具,找一套適合團隊是最重要的。

[Read More]

Go 語言的 init 函式

cover

本篇會帶大家認識 Go 語言的 init 函式,在了解 init func 之前,大家應該都知道在同一個 Package 底下是不可以有重複的變數或者是函式名稱,但是唯獨 init() 可以在同一個 package 內宣告多次都沒問題。底下看例子,可以發現的是不管宣告多少次,都會依序從最初宣告到最後宣告依序執行下來。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import (
  "fmt"
)

func init() {
  fmt.Println("init 1")
}

func init() {
  fmt.Println("init 2")
}

func main() {
  fmt.Println("Hello, playground")
}
[Read More]

如何使用 Go 語言 Flag 套件 (影片教學)

coever

之前寫過一篇『用 Golang 寫 Command line 工具』教學,作者我錄了一個教學影片,教大家如何使用 Go 語言Flag 套件,套件用法很簡單,相信看了底下的影片教學馬上就會了,但是在這邊強調,用 flag 的時機會是在寫 command line tool 給同事或者是自己用,如果是寫大型 Web Application,不推薦使用 flag,原因是 flag 不支援讀取系統環境變數,如果是 web 服務,想要動態改變 port 或者是 DB 連線資訊,就變得比較複雜,也無法搭配 Docker 使用,更不用說想結合 Kubernetes。如果要寫大專案,請使用 urfave/clispf13/cobra

[Read More]

Go 語言基礎實戰教學影片上線了

cover

去年在台灣推廣 Drone 這套由 Go 語言所撰寫的開源專案,身為維護者之一,也將 Drone 跟 Gitea 完成整合。如果對於從開發到部署整個流程,還不是很了解的朋友,我個人就是推薦使用 Drone,去年九月也推出 Drone 的教學影片系列:『一天學會自動化測試及部署』,在公司使用 Drone 到現在,不曾看到服務中斷,啟動速度也是毫秒等級。為什麼會這麼穩定及快速呢?當然要歸功於 Go 語言。而這次我個人針對 Go 語言,錄製了一份基礎教學『GO 語言基礎實戰

[Read More]

Go 語言搭配 Docker Healthy Check 檢查

cover

Docker 1.12 版本後,提供了 HEALTHCHECK 指令,通過指定的一行命令來判斷容器內的服務是否正常運作。在此之前大部分都是透過判斷程式是否 Crash 來決定容器是否存活,但是這地方有點風險的是,假設服務並非 crash,而是沒辦法退出容器,造成無法接受新的請求,這就確保容器存活。現在呢我們可以透過在 Dockerfile 內指定 HEALTHCHECK 指令來確保服務是否正常。而用 Go 語言開發的 Web 服務該如何來實現呢?

[Read More]

用 Go 語言實現單一或多重 Queue 搭配 optimistic concurrency

Screen Shot 2018-03-10 at 3.22.59 PM

本篇教學會著重在如何使用 Go 語言的 goroutinechannelMongoDB 是一套具有高效能讀寫的 NoSQL 資料庫,但是不像傳統關連式資料庫,有非常好用的 Transaction 交易模式,而在 MongoDB 也可以透過 Two Phase Commits 來達成交易功能,大家可以先打開文件看看,非常冗長,工程師需要花很多時間閱讀文件並且實現出來。而在 Go 語言內,我們可以在 Single Thread 內同一時間點讀寫存取同一筆資料庫來解決此問題。此篇作法只適合運作在單一 application,如果是執行多個 application 則需要透過其他方式來解決,像是 Optimistic concurrency control

[Read More]

將 Go Html Template 存入 String 變數

Go 語言內通常都將 Html Temaple 寫入到 io.Writer interface 像是 *http.ResponseWriter,但是有些情境需要將 Template 寫入到 String 變數內,例如實作簡訊 Template,這時候需要將 Html Temaple 轉成 String。該如何實作,非常簡單,只需要在任意變數內實作 io.Writer interface 即可,而 String 該如何轉換呢?可以使用 buffer’s pointer

[Read More]

在 AWS Lambda 上寫 Go 語言搭配 API Gateway

Snip20180124_2

這應該不是什麼新消息了,就是 AWS Lambda 正式支援 Go 語言,也就是可以將 Go 語言編譯出來的二進制檔案直接放進去 Lambda Function 內,前面可以搭配 API Gateway,後面可以搭配 CloudWatchS3,本文章會教大家如何將 Gin 打包編譯進 Lambda,官網其實也有提供 Library 或範例方便大家實作,大家可以參考看看。

[Read More]

用 Go 語言減少 node_modules 容量來加速部署

之前寫過一篇『減少 node_modules 大小來加速部署 Node.js 專案』文章,透過 Yarn 指令可以移除不必要的模組,剩下的模組佔據整個專案大部分容量,那該如何針對留下的模組來瘦身呢?這週看到 Node.js 大神 TJ 又發了一個 Go 語言專案叫做 node-prune,此專案用來移除在 node_modules 內不必要的檔案,那哪些才是不必要的檔案呢?

[Read More]

從 Nginx 換到 Caddy

The_Caddy_web_server_logo.svg

終於下定決心將 Nginx 換到 Caddy 這套用 Go 語言所撰寫的開源套件,大家一定會有所疑問『為什麼要換掉 Nginx 而改用 Caddy』,原因其實很簡單,你現在看的 Blog 安裝在 Linode 機器上面,之前跑的是 Nginx 搭配 letsencrypt,但是必須要寫一個 Scripts 來自動更新 letsencrypt 憑證,這機制最後不太運作,加上這一年來,每三個月就會有人丟我說『你的 Blog 憑證過期了』,所以就在這時間點,花點時間把 Nginx 設定調整到 Caddy,轉換的時間不會花超過一小時喔。

[Read More]