diff --git a/ch4/ch4-03.md b/ch4/ch4-03.md index b88fa6e..23c6a8d 100644 --- a/ch4/ch4-03.md +++ b/ch4/ch4-03.md @@ -176,4 +176,19 @@ func main() { } ``` +Go程序員將這種忽略value的map當作一個字符串集合,併非所有map[string]bool類型value都是無關緊要的;有一些則可能會同時包含tue和false的值。 + +有時候我們需要一個map或set的key是slice類型,但是map的key必鬚是可比較的,但是slice併不滿足這個條件。不過,我們可以通過兩個步驟繞過這個限製。第一步,定義一個輔助函數k,將slice轉爲map對應的string類型的key,確保隻有x和y相等時k(x) == k(y)才成立。然後創建一個key爲string類型的map,在每次對map操作時先用k輔助函數將slice轉化爲string類型。 + +下面的例子演示了如何使用map來記録提交相同的字符串列表的次數。它使用了fmt.Sprintf函數將字符串列表轉換爲一個字符串以用於map的key,通過%q參數忠實地記録每個字符串元素的信息: + +```Go +var m = make(map[string]int) + +func k(list []string) string { return fmt.Sprintf("%q", list) } + +func Add(list []string) { m[k(list)]++ } +func Count(list []string) int { return m[k(list)] } +``` + TODO