? ? ? ? 在go的標志內置包strings和bytes中都有一個函數Map,? 這個函數的作用是:?將輸入字符串/字節切片中的每個字符使用函數處理后映射后返回一份字符串/字節切片的副本,如果函數中的某個字符返回負數則刪除對應的字符。
? ? ? ? 作用很簡單,當時對于新手來說要理解他還是有一定的困難,而且這個map在其他語言里面也非常常見,特別是在大數據處理時類似的map用法隨處可見。
? ? ? ? 注意這里的rune, 在go語言里面rune代表的是一個 int32 類型的數字,他在這里對應的就是unicode碼表里面的數字碼,計算機世界里面的每一個字母數字字符都有一個對應的unicode碼。 1個rune可表示3個字節。而byte只能表示1個字節, 我們的1個漢字就需要3個字節來表示,這也是go里面我們處理漢字是必須要使用rune來表示,否則就可能會亂碼的原因。
golang中的2個Map函數原型:
這2個Map函數僅入參函返回不一樣,mapping處理函數是一模一樣
strings包中的Map函數
func Map(mapping func(rune) rune, s string) string? ?
bytes包中的Map函數
func Map(mapping func(r rune) rune, s []byte) []byte
?
Map函數使用示例
官方的示例太晦澀,以下是一個簡單易懂的一個Example測試用例的示例:
將字符串中的你好替換為hi
// 測試用例 xxx_test.go
func ExampleDemo() {str := "你好,我是golang!"strMap := strings.Map(func(r rune) rune {// 注意這里的參數 r 就代表一個字符(包括多字節的字符,如漢字),// rune代表的是字符對應的ascii碼值,所以可以直接進行碼值比較和運算switch {case r == '你': // 注意這里的運算對象只能使用單引號,且只能是一個字符return 'h' // 將 你 替換為 hcase r == '好':return 'i'default:return r // 默認原樣返回}}, str)fmt.Println(strMap) // output: hi,我是golang!
}
從以上示例中可以清除的看到 Map函數將我們的字符串??"你好,我是golang!" 替換為了?"hi,我是golang!"??
官方的示例:
package mainimport ("fmt""strings"
)func main() {rot13 := func(r rune) rune {switch {case r >= 'A' && r <= 'Z':return 'A' + (r-'A'+13)%26case r >= 'a' && r <= 'z':return 'a' + (r-'a'+13)%26}return r}fmt.Println(strings.Map(rot13, "'Twas brillig and the slithy gopher..."))
}
原理是一模一樣的,但是返回的一堆看不明白的字符串?'Gjnf oevyyvt naq gur fyvgul tbcure...? 可能會把你搞得不知所措......
參考:
https://pkg.go.dev/strings#Map?
https://pkg.go.dev/bytes#Map?
https://dev.tekin.cn