1.两个常见的函数:
len()获取字符串占用字节的长度(字节数)utf8.RuneCountInString()获取字符串的长度(字符数)
str := "Hello 世界"
fmt.Printf("len = %d, RuneCount = %d`\`n", len(str), utf8.RuneCountInString(str)) //len = 12, RuneCount = 8
2.那么(字节数 12)和(字符数 8)是怎么来的呢?
(需要先了解一个叫字符集的东西)
Unicode 与 ASCII 相似,都是一种字符集,它规定了各个字符在自己的标准下的唯一【值】
H 在 ASCll 字符集中的【值】表示为72 ; H 在 Unicode 字符集中的【值】表示为72
"界"的 ASCll 字符集中的【值】表示为30028 ; "界"的 Unicode 字符集中的【值】表示为\u754c(那么那个常见的 UTF-8 又是什么)
Golang中
string的内部实现就是使用的 UTF-8 编码。
UTF-8 是一种编码规则,将 Unicode 中字符的【值】以一种变长编码规整,从 1~4 个字节不等。
问题是无数的字符,他们都占1,2,3,4 到底是多少呢?只需记住汉字是 3 其余的字符一般为 1
所以 "Hello 世界" 字符串在字符数被计算时,编译器就知道这是一个 UTF-8 下的字符串
根据汉字占3字节 其余一般占1字节 ,所以 5 个字母 + 1个空格 + 2个汉字 = 12字节
根据字符数就是字符个数,所以所以 5 个字母 + 1个空格 + 2个汉字 = 8字符
3.byte 与 rune 有什么关系吗?
1byte = 8bit,字节是计算机中基本的计量单位。
byte类型,就是uint8的别名 (-128~127)
rune 表示一个 UTF-8 字符
rune就是int32的别名 (-2^31 ~ 2^31-1)
从范围就可以看出加入一个汉字被换算出来的 3 个 byte 但凡有一个部分值不在(-128~127)那就直接表示不出来了,所以在Golang中涉及单个字符的调整,还是用 rune 来处理字符串更好;
那用 string 处理呢?答案是不建议因为 Golang 中不能用 str[i] 的方式直接进行字符串修改
4.面试题:翻转含有中文、数字、英文字母的字符串
package main
import"fmt"
func main() {
src := "你好abc啊哈哈"
dst := reverse([]rune(src)) //因此将`字符串`转为`rune的切片`,再进行翻转
fmt.Printf("%v\n", string(dst))
}
func reverse(s []rune) []rune {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s
}
面试题转载自: [mp.weixin.qq.com/s?__biz=Mzg…]