Golang中字符串类型的"A"与带单引号的'A'的差异及代码修复方案
嘿,我来帮你把这几个问题理清楚,顺便解决你的代码问题~
问题1:带单引号和不带单引号的字符串差异
你看到的带单引号的字符串,是strconv.QuoteRune()函数的返回结果——这个函数会把一个rune(单字符)转换成带单引号包裹的字符串,比如把rune类型的'A'转成字符串"'A'"(注意是包含单引号的)。而你的one_point数组里的元素是"A",这是没有单引号的普通字符串,两者内容完全不一样,所以你的判断条件永远不成立,才会一直输出“not equal”。
问题2:修改代码实现正确的字符检查
其实你不需要用strconv.QuoteRune()来做转换,直接把rune转成普通字符串就可以和数组里的元素比较了。这里给你两种实现方式,第二种效率更高:
方式1:直接遍历比较(适合小数组)
package main import "fmt" func main() { one_point := []string{"A", "D", "F"} message := "AB" // 遍历消息中的每个字符 for _, charRune := range message { charStr := string(charRune) isInArray := false // 检查是否在目标数组中 for _, target := range one_point { if target == charStr { isInArray = true break } } // 输出结果 if isInArray { fmt.Printf("%s 在数组中\n", charStr) } else { fmt.Printf("%s 不在数组中\n", charStr) } fmt.Println("------------------------------") } }
方式2:用Map做快速查找(适合大数据量)
如果你的目标字符数组很大,用数组遍历效率会很低,换成map来做O(1)查找会更高效:
package main import "fmt" func main() { // 把目标字符转成map,键是字符,值是bool(仅用来标记存在) charMap := map[string]bool{"A": true, "D": true, "F": true} message := "AB" for _, charRune := range message { charStr := string(charRune) if charMap[charStr] { fmt.Printf("%s 在数组中\n", charStr) } else { fmt.Printf("%s 不在数组中\n", charStr) } fmt.Println("------------------------------") } }
运行修改后的代码,就能正确识别A在数组中,B不在数组中啦。
问题3:Go中'A'和"A"的区别
这两个在Go里完全是不同的类型:
'A'是rune类型,本质上是int32的别名,代表单个Unicode字符,它的值是该字符的Unicode码点(比如'A'的数值是65)。"A"是string类型,是一个不可变的字节序列,这里它的长度是1,存储的是'A'的UTF-8编码字节(对于ASCII字符来说,就是单个字节0x41)。
你可以用这段代码直观感受两者的区别:
package main import "fmt" func main() { r := 'A' s := "A" fmt.Printf("'A' 的类型:%T,数值:%d\n", r, r) // 输出:'A' 的类型:int32,数值:65 fmt.Printf("\"A\" 的类型:%T,内容:%s\n", s, s) // 输出:"A" 的类型:string,内容:A }
内容的提问来源于stack exchange,提问作者Chau Loi
相关产品推荐
相关产品推荐

