errors

As func As(err error, target interface{}) bool 第一個參數是現在拿到的 error 會透過呼叫 Unwrap 來比對 err 的第一個錯誤是否和 target 相同 如果對的話,會把 target 設定為 err 並回傳 true 否則回傳 false 範例 err := dec.Decode(dst) if err != nil { var syntaxError *json.SyntaxError switch { case errors.As(err, &syntaxError): return fmt.Errorf("body contains badly-formed JSON (at character %d)", syntaxError.Offset) default: return err } } Is func Is(err error, target error) bool 第一個參數是現在拿到的 error 第二個參數是想要比對的特定 error 比對方式是透過呼叫 Unwrap 逐一拆解來比對是否包含 特定的 error

json

tag 標記用法 範例 json:"name,omitempty" 這個欄位名稱為 name,如果欄位內容是空值的話,則欄位會被忽略 範例 json:"-" 不管欄位名稱是什麼,都會忽略不印出 omitempty 這個欄位 如果是結構的話 無論是否為空值,一定會產生出欄位,值為空 例如 s := struct { Foo struct { Bar string `json:",omitempty"` } `json:",omitempty"` }{} // encoding result {"Foo":{}} 解決辦法是透過指標的方式 例如 s := struct { Foo *struct { Bar string `json:",omitempty"` } `json:",omitempty"` }{} // encoding result {} 此外如果欄位型態是 time.Time 的話 omitempty 不會運作 escaped json 編碼的時候如果碰到 > < & 會轉為逃逸字元 範例 s := []string{ "<foo>", "bar & baz", } // result ["\u003cfoo\u003e","bar \u0026 baz"] 如果要避免的話,要在 json.

golang-migrate

github link 以 postgreSQL 為例 安裝 (用 homebrew) $ brew install golang-migrate 確認版本 $ migrate -version 建立 migration 檔案 # 建立 migration 檔案 $ migrate create -seq -ext=.sql -dir=./migrations create_movies_table -sql : 用數字序列的方式命名 migration 檔案 (如0001, 0002, …) 預設是用 unix timestamp -ext : 指定 migration 檔案的 extension 名稱 -dir : 表示我們要把 migration 檔案建立在哪個路徑 (若路徑不存在的話會自動建立) create_movies_table 是想要建立的檔案名稱 接著系統會建立兩份 migration 檔案 000001_create_movies_table.down.sql 000001_create_movies_table.up.sql 之後便可在這兩份檔案寫入對應的 SQL 語法 執行 migrate (up) $ export GREENLIGHT_DB_DSN='postgres://greenlight:@localhost/greenlight?

Signal

Signal 類型 Signal Description Keyboard Shortcut Catchable SIGINT 鍵盤中斷訊號 Ctrl + C true SIGQUIT 鍵盤離開訊號 Ctrl + |true SIGKILL 刪除程序(立即終止) - no SIGTERM 照順序終止程序 - true kill pid 會傳送SIGTERM到程序pid shutdown() shutdown 的關閉流程不會中斷任何作用中的連線 先關閉所有 open 的 listener 再關閉所有 idle 的 listener 等候作用中連線成為 idle shutdown http.Server 的 Shutdown 會在結束時回傳錯誤碼 (沒錯誤的話回傳 nil)

Web Development

web url encoding 在 url 內的 + 代表空白,也可以用 %20 表示 user enumeration 一種可能的帳號攻擊行為 比如說嘗試使用者登入,輸入email 和 密碼 系統顯示 密碼錯誤 而不是 帳號密碼錯誤 或 找不到此使用者 代表這個使用者的 email 信箱是存在且有註冊過這個網站的 即使用者的資訊被其他人知曉 要避免的話,可以統一錯誤訊息或是把錯誤訊息寫得更通用一點 CORS cross-origin requests origin: 如果兩個 URL 的 scheme, host, port 都相同, 即為相同 origin (path 不需要相同) https://foo.com:443/a/ https 是 scheme foo.com 是 host 443 是 port a 是 path web browser 預設是禁止的 網站可以內嵌其他 origin 的資源 一個網站可以傳送資料給不同的 origin 位址 但是一個網站不能夠接收來自不同 origin 的資料 (瀏覽器行為) 可以透過設定 Header 內的 Access-Control 來控制允許或不允洗特定的 cross-origin requests 打我們的 API 藍覽器以外的工具,如 curl, wget 不會受到影響 如果在 API 的 response header 的 Header 的 Access-Control-Allow-Origin 塞值 *

Slice

建立空的 Slice var movies []*Movie movie = &Movie{} // 這樣子建立出來的 movies slice 是 nil // 但已經足夠用來做 append // 不需要寫成 movies := []*Movie{} movies = append(movies, movie) 把 array 轉成 slice // hash 是 [32]byte 的 byte array hash := sha256.Sum256(info) // b.Hash 是 byte slice b.Hash = hash[:]

英文: 片語

B bear/keep sth in mind 記住 I in terms of 在…方面;從…方面來說 in turn 依次,輪流 O off the shelf (産品) 現成的,不需訂製的 P piece sth together 拼合;湊集 R rule of thumb 經驗法則 T the nuts and bolts 實質性內容

Linux Cmd

find 搜尋檔案 # 在 當前資料夾 下對 檔案名稱 *_spec.rb 做搜尋 $ find . -name "*_spec.rb" export 設定環境變數 # 環境變數 設定資料庫連線 DSN $ export GREENLIGHT_DB_DSN='postgres://greenlight:@localhost/greenlight?sslmode=disable' # 列出環境變數 $ export -p df 顯示硬碟使用量 short for disk free Filesystem: 檔案系統 Size: 總容量 Used: 已用容量 Avail: 剩餘容量 Use%: 已用百分比 Mounted on: 掛載點 # -h 以容易識別的格式顯示硬碟空間使用量 $ df -h # -T 顯示每個分割區所屬的檔案系統名稱 $ df -T free 顯示記憶體使用情況 # -m 以 MB 作為單位顯示 $ free -m curl 可以用來做連線資料傳輸

PostgreSQL

介紹 登入機制 peer authentication: 登入過一次後,就不用再驗證,可以直接輸入 psql 進入 cli 模式 password-based authentication: 要輸入密碼才可以登入的驗證 指令 Meta command 在 PostgreSQL 的指令,以 \ 為 meta command, 以提供一些有用的操作 -- see the full list of available meta commands \?-- list all databases \l-- list tables \dt-- list users \du-- list of all available configurations \dF安裝 extension 安裝 citext 的擴充功能 CREATEEXTENSIONIFNOTEXISTScitext;建立使用者 建立名為 greenlight 且密碼為 pa55word 的帳號 CREATEROLEgreenlightWITHLOGINPASSWORD'pa55word';查看使用者 \du使用者登入 登入 greenlight 角色 需要登入密碼的話會跳出輸入提示 psql --host=localhost --dbname=greenlight --username=greenlight 刪除使用者 在 SHELL 直接輸入指令