Go 語言系列(十一):面試必問問題

這是 Go 語言從零到 Web 應用系列的第十一篇。前十篇我們完成了從基礎到實戰的完整學習路徑,這篇整理 Go 面試中最常被問到的核心問題,幫助你在面試中展現對 Go 的深入理解。 Goroutine 與 Channel Q1:Go 的 Goroutine 排程模型是什麼? Go 使用 GMP 模型來排程 goroutine: G(Goroutine):要執行的工作單元,每個 go func() 建立一個 G M(Machine):作業系統執行緒,實際執行程式碼的載體 P(Processor):邏輯處理器,持有本地的 G 佇列,數量預設等於 CPU 核心數 排程流程: G1, G2, G3 ... → P(本地佇列)→ M(OS Thread)→ CPU P 從自己的本地佇列取出 G 放到 M 上執行。當本地佇列空了,會從其他 P「偷」G 來執行(work stealing)。 package main import ( "fmt" "runtime" ) func main() { // 查看 P 的數量 fmt.Println("GOMAXPROCS:", runtime.GOMAXPROCS(0)) // 查看目前的 goroutine 數量 fmt.Println("NumGoroutine:", runtime.NumGoroutine()) for i := 0; i < 5; i++ { go func(n int) { fmt.Printf("goroutine %d running on thread\n", n) }(i) } fmt.Println("NumGoroutine after launch:", runtime.NumGoroutine()) runtime.Gosched() // 讓出 CPU 給其他 goroutine } 面試加分點: ...

2026年2月24日 · 6 min · 1269 words · Jack

Go 語言系列(五):錯誤處理與併發

這是 Go 語言從零到 Web 應用系列的第五篇,也是基礎篇的最後一篇。這篇要學的是 Go 最有特色的兩個主題:錯誤處理和併發。 錯誤處理 Go 的錯誤哲學 Go 沒有 try/catch。它的哲學是:錯誤是正常的程式流程,應該被明確處理,而不是被「拋出」和「捕捉」。 Go 使用多值回傳來傳遞錯誤: result, err := doSomething() if err != nil { // 處理錯誤 return err } // 使用 result 這個模式你在 Go 程式碼中會看到無數次。 error 介面 Go 的 error 是一個簡單的介面: type error interface { Error() string } 任何實作了 Error() string 方法的型別都是 error。 建立錯誤 import ( "errors" "fmt" ) // 方式一:errors.New err := errors.New("something went wrong") // 方式二:fmt.Errorf(可以格式化訊息) name := "config.json" err = fmt.Errorf("file not found: %s", name) 自訂 Error 型別 type ValidationError struct { Field string Message string } func (e *ValidationError) Error() string { return fmt.Sprintf("validation failed on %s: %s", e.Field, e.Message) } func validateAge(age int) error { if age < 0 || age > 150 { return &ValidationError{ Field: "age", Message: "must be between 0 and 150", } } return nil } 錯誤包裝(Error Wrapping) Go 1.13 引入了錯誤包裝機制,讓你可以在傳遞錯誤時加入上下文: ...

2026年2月24日 · 6 min · 1181 words · Jack