讓使用者上傳檔案、存在伺服器的某個目錄底下,是很常見的需求。最直覺的寫法只要兩行,但這兩行藏了三個問題:檔名可以跳出目錄、寫到一半當機會留下殘檔、讀檔時可能被一個 FIFO 卡住整個 goroutine。 這篇從最直覺的寫法開始,逐一修掉這三個問題。主角是 Go 1.24 新增的 os.Root。
服務啟動時把連線字串印到 log,方便確認連到哪台機器,這是很常見的寫法。Go 的 net/url 有一個 Redacted(),看名字會以為它能把敏感資訊遮掉,但它只遮「密碼」這一格。很多連線字串的祕密根本不放在那一格。 這篇用實際跑過的測試,整理 Redacted() 會漏掉的幾種情況,以及 url.Parse 錯誤訊息的同類問題,最後給一個簡單的替代寫法。
前言 Go 語言中並發程序可以用兩種方式來實現。 一種是 goroutine 和 channel,其支持 “交談循序程式”(communicating sequential processes)或被簡稱為 CSP。 CSP 是一個現代的並發程式模型,在這種程式模型中值會在不同的運行實例(goroutine)中傳遞,儘管大多數情況下被限制在單一實例中。 另一種是傳統的並發模型,多線程共享內存(基於共享變量的並發) , 會在後續單獨闡述。
並發程式中的同步也就是我們通常說的鎖的主要作用是保證多個線程或者 goroutine 在訪問同一片內存時不會出現混亂的問題。 Go 語言的 sync 包提供了常見的並發程式同步 。 今天的文章裡讓我們回到應用層 , 聚焦 sync 包裡這些同步的應用場景 , 同時也會介紹 sync 包中的 Pool 和 Map 的應用場景和使用方法。