文章目录
- 适用于处理 ASCII 字符(英文字符、数字、常见符号): // 创建存储 byte 的 map byteMap := make(map[byte]int) // 添加 ASCII 字符 byteMap[‘A’] = 65 byteMap[‘a’] = 97 byteMap[‘0’] = 48 fmt.Printf(“%vn”, byteMap) // 输出: map[48:48 65:65 97:97] // 查找字符 if value, exists := byteMap[‘A’]; exists { fmt.Printf(“ASCII 值: %dn”, value) // 输出: ASCII 值: 65 }
- 适用于处理 Unicode 字符(支持中文、日文、特殊符号等): // 创建存储 rune 的 map runeMap := make(map[rune]string) // 添加 Unicode 字符 runeMap[‘你’] = “you” runeMap[‘好’] = “good” runeMap[‘世’] = “world” runeMap[‘界’] = “boundary” runeMap[‘★’] = “star” fmt.Println(runeMap) // 输出: map[19990:world 30028:boundary 20320:you 22909:good 9733:star] // 查找中文字符 if meaning, exists := runeMap[‘好’]; exists { fmt.Printf(“含义: %sn”, meaning) // 输出: 含义: good }
- // 字符作为键,字符串作为值 emojiMap := map[rune]string{ ‘❤’: “love”, ‘⚠’: “warning”, ‘⌚’: “watch”, } fmt.Println(emojiMap[‘❤’]) // 输出: love
- // 字符串作为键,字符作为值 countryFlags := map[string]rune{ “China”: ‘🇨’, “Japan”: ‘🇯’, “France”: ‘🇫’, } fmt.Printf(“%cn”, countryFlags[“China”]) // 输出: 🇨 遍历字符串并统计字符频率 func countCharacters(text string) map[rune]int { counts := make(map[rune]int) // 遍历每个 Unicode 字符 for _, char := range text { counts[char]++ } return counts } func main() { text := “Go语言真棒!🚀” charCounts := countCharacters(text) for char, count := range charCounts { fmt.Printf(“%c: %dn”, char, count) } } 输出示例: G: 1o: 1语: 1言: 1真: 1棒: 1!: 1🚀: 1
- // 创建合法字符集 validChars := map[rune]bool{ ‘A’: true, ‘B’: true, ‘C’: true, ‘1’: true, ‘2’: true, ‘3’: true, ‘!’: true, ‘@’: true, ‘#’: true, } // 验证密码只包含合法字符 password := “ABc123!@#” valid := true for _, char := range password { if !validChars[char] { valid = false break } } fmt.Println(“密码有效:”, valid) // 输出: 密码有效: false(因为包含小写 ‘c’)
- // 创建大小写转换表 lowerToUpper := map[rune]rune{ ‘a’: ‘A’, ‘b’: ‘B’, ‘c’: ‘C’, ‘α’: ‘Α’, ‘β’: ‘Β’, ‘γ’: ‘Γ’, // 支持希腊字母 } func toUpper(r rune) rune { if upper, exists := lowerToUpper[r]; exists { return upper } return r } text := “abcαβγ” var result []rune for _, char := range text { result = append(result, toUpper(char)) } fmt.Println(string(result)) // 输出: ABCΑΒΓ
目录
- Map的基本概念
- Go 中的 Map 与字符处理指南
- 存储字符的两种方式
- 1. 使用 byte 类型
- 2. 使用 rune 类型
- 字符与字符串的关系
- 1. 使用字符作为键,字符串作为值
- 2. 使用字符串作为键,字符作为值
- 特殊字符处理技巧
- 1. 过滤特殊字符
- 2. 字符转换表
- 注意事项
在 Go 语言中,map 是一种无序的数据结构,它由键(Key)和值(Value)组成,类似于其他语言中的字典或哈希表。map 的设计目标是通过键的哈希值来高效地访问对应的值。
map 是 Go 语言中的一种内建类型,它支持高效的键值对查找操作。键和值的类型可以是任何类型,但键必须是可比较的类型(即支持 == 和 != 比较操作符)。
在 Go 中,map 可以存储字符,但需要理解字符在 Go 中的表示方式。在 Go 语言中,"字符" 实际上有两种表示方法:byte(ASCII 字符)和 rune(Unicode 字符)。
适用于处理 ASCII 字符(英文字符、数字、常见符号):
// 创建存储 byte 的 map
byteMap := make(map[byte]int)
// 添加 ASCII 字符
byteMap['A'] = 65
byteMap['a'] = 97
byteMap['0'] = 48
fmt.Printf("%vn", byteMap) // 输出: map[48:48 65:65 97:97]
// 查找字符
if value, exists := byteMap['A']; exists {
fmt.Printf("ASCII 值: %dn", value) // 输出: ASCII 值: 65
}
适用于处理 Unicode 字符(支持中文、日文、特殊符号等):
// 创建存储 rune 的 map
runeMap := make(map[rune]string)
// 添加 Unicode 字符
runeMap['你'] = "you"
runeMap['好'] = "good"
runeMap['世'] = "world"
runeMap['界'] = "boundary"
runeMap['★'] = "star"
fmt.Println(runeMap) // 输出: map[19990:world 30028:boundary 20320:you 22909:good 9733:star]
// 查找中文字符
if meaning, exists := runeMap['好']; exists {
fmt.Printf("含义: %sn", meaning) // 输出: 含义: good
}
// 字符作为键,字符串作为值
emojiMap := map[rune]string{
'❤': "love",
'⚠': "warning",
'⌚': "watch",
}
fmt.Println(emojiMap['❤']) // 输出: love
// 字符串作为键,字符作为值
countryFlags := map[string]rune{
"China": '🇨',
"Japan": '🇯',
"France": '🇫',
}
fmt.Printf("%cn", countryFlags["China"]) // 输出: 🇨
遍历字符串并统计字符频率
func countCharacters(text string) map[rune]int {
counts := make(map[rune]int)
// 遍历每个 Unicode 字符
for _, char := range text {
counts[char]++
}
return counts
}
func main() {
text := "Go语言真棒!🚀"
charCounts := countCharacters(text)
for char, count := range charCounts {
fmt.Printf("%c: %dn", char, count)
}
}
输出示例:
G: 1
o: 1
语: 1
言: 1
真: 1
棒: 1
!: 1
🚀: 1
// 创建合法字符集
validChars := map[rune]bool{
'A': true, 'B': true, 'C': true,
'1': true, '2': true, '3': true,
'!': true, '@': true, '#': true,
}
// 验证密码只包含合法字符
password := "ABc123!@#"
valid := true
for _, char := range password {
if !validChars[char] {
valid = false
break
}
}
fmt.Println("密码有效:", valid) // 输出: 密码有效: false(因为包含小写 'c')
// 创建大小写转换表
lowerToUpper := map[rune]rune{
'a': 'A', 'b': 'B', 'c': 'C',
'α': 'Α', 'β': 'Β', 'γ': 'Γ', // 支持希腊字母
}
func toUpper(r rune) rune {
if upper, exists := lowerToUpper[r]; exists {
return upper
}
return r
}
text := "abcαβγ"
var result []rune
for _, char := range text {
result = append(result, toUpper(char))
}
fmt.Println(string(result)) // 输出: ABCΑΒΓ
字符类型选择:
- 处理英文和基本符号:使用
byte - 处理多语言和表情符号:使用
rune
字符字面量:
- 单引号
'A'表示字符(类型为rune) - 双引号
"A"表示字符串
中文字符处理:
chineseMap := map[rune]string{
'中': "middle",
'国': "country",
}
fmt.Println(chineseMap['国']) // 输出: country
性能考虑:
- 对于纯英文场景,
byte性能更好 - 对于多语言支持,必须使用
rune
特殊字符表示:
specialChars := map[string]rune{
"lambda": 'λ',
"infinity": '∞',
}
掌握这些技巧后,你可以灵活地在 Go 中使用 map 来处理各种字符需求,从简单的 ASCII 处理到复杂的多语言字符处理都能得心应手。
到此这篇关于Go 中的 Map 与字符处理指南的文章就介绍到这了,更多相关Go Map字符内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- golang遍历处理map时的常见性能陷阱与解决方法
- Go语言中的map扩容机制
- Go语言如何实现线程安全的Map
- Golang Map简介以及底层原理
- 解读go在遍历map过程中删除成员是否安全
- 详解Go语言如何实现并发安全的map
- GO语言中的Map使用方法详解
- Go语言map实现顺序读取