Golang

Go defer 遇上 os.Exit 時失效

間單介紹 defer 使用與特性,並說明遇上 os.Exit 失效的原因

ta-ching chen

3 minute read

前言

在撰寫 Go 程式過程中,我們可能需要在函式執行完畢後執行特定動作以確保不會發生異常,比方說讀取檔案完畢後需要關閉 file descriptor。 為求程式簡潔,最常見的做法是呼叫 defer 進行處理。以下會對 defer 幾個特性做簡介,並且說明在什麼狀況下 deffered function 不會如預期般被執行。

若沒有耐心者,可直接跳到 當 defer 遇上 os.Exit 看本文重點 (笑)

defer 簡介

寫程式時常會遇到需要讀寫檔案、建立連線等行為,在 Go 內類似的操作往往伴隨著關閉 file descriptor 或 connection 的相關操作。

file.Close()

除非偏好波動拳寫法以外

波動拳

否則 early return 寫法往往會包含多個 return,若此時需要在每個 return 前寫同樣的程式碼往往導致簡潔性被破壞。

func fileCopyv1(srcFile, dstFile string) (int64, error) {
    src, err := os.Open(srcFile)
    if err != nil {
        return 0, err
    }

    dst, err := os.Create(dstFile)
    if err != nil {
        src.Close()
        return 0, err
    }

    src.Close()
    dst.Close()
    return io.Copy(dst, src)
}

Go HTTP Header 的那些坑

透過簡單範例說明 Go 開發時常見的 HTTP Header 操作誤區

ta-ching chen

3 minute read

前言

最近開發時常需要針對 HTTP Header 進行操作,過程中發現一些平常並不會特別注意但會造成問題的地方。

以下會以範例講解這陣子所遇到的坑(笑),文中範例程式可以到此 Github Repo 下載。

ResponseWriter.Write 導致客戶端收到錯誤 HTTP 狀態碼

首先請各位看下面的範例程式,並猜看看使用者會收到哪種 HTTP 狀態碼?

http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("foobar"))
    w.WriteHeader(http.StatusBadRequest)
})

覺得是 400 Bad Request? 其實正確答案是 200 OK。

$ curl -i http://127.0.0.1:8080
HTTP/1.1 200 OK
Date: Thu, 20 Dec 2018 06:31:33 GMT
Content-Length: 6
Content-Type: text/plain; charset=utf-8

foobar

From NodeJs, Scala to Go

說明後端開發語言轉換至 Golang 原因

ta-ching chen

1 minute read

演講投影片

  • 2017 iTHome GopherDay

打造最小 Go Docker Image

簡短幾步驟輕鬆打造最小 Docker Image

ta-ching chen

1 minute read

Hello World

先寫個簡單不斷印出 Hello World 的小程式

// main.go
package main

import (
    "fmt"
    "time"
)

func main() {
    for {
        fmt.Println("Hello World!")
        time.Sleep(1 * time.Second)
    }
}