GO语言:string
len()
// 求长度 len() 所得为字符串所占的字节数
length := len("Hello world")
fmt.Println(length)
// len == 12 go语言字符串使用utf-8编码 一个汉字占3个字节
length = len("我是魚禾")
fmt.Println(length)
结果:
11
12
len()获取的是字符串所占字节数的大小,而不是字符串字符的数量
若要计算字符串字符数量,因先将字符串转换为[]rune切片
// 求长度 len() 所得为字符串所占的字节数
length := len([]rune("Hello world"))
fmt.Println(length)
// len == 12 go语言字符串使用utf-8编码 一个汉字占3个字节
length = len([]rune("我是魚禾"))
fmt.Println(length)
结果:
11
4
在Go 语言中,字符的类型有以下两种:
- uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
- rune类型,代表一个 UTF-8字符。
当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。
rune类型实际是一个int32。
char := '魚'
fmt.Printf("%T", char)
结果:
int32
当需要处理中文等ASCII无法表示的字符时,需要使用rune类型来处理。
当然也可以使用byte进行处理
s1 := "Hello world"
for i := 0; i < len(s1); i++ {
fmt.Printf("%c(%d) ", s1[i], s1[i])
}
fmt.Println()
s2 := "你好"
for _, char := range s2 {
fmt.Printf("%c(%d) ", char, char)
}
fmt.Println()
s3 := "Hello 嗨"
for i := 0; i < len(s3); i++ {
fmt.Printf("%c(%d) ", s3[i], s3[i])
}
fmt.Println()
结果:
H(72) e(101) l(108) l(108) o(111) (32) w(119) o(111) r(114) l(108) d(100)
你(20320) 好(22909)
H(72) e(101) l(108) l(108) o(111) (32) å(229) (151) ¨(168)
因为一个byte类型的数据仅能表示8位二进制数(256个),一个汉字无法通过一个字节来表示,程序将一个汉字对应的二进制拆分为了3个byte类型数据了。而rune类型(uint32)能够表示32位二进制数,能够表示一个汉字字符所对应的二进制数字,所以不会出现乱码问题。
字符串拼接
①+运算符拼接
// 1.+号拼接
s1 := "Hello"
s2 := "world"
s := s1 + " " + s2
fmt.Println(s)
Hello world
②Sprintf拼接
// 2.Sprintf 拼接
s1 := "Hello"
s2 := "world"
s := fmt.Sprintf("%s %s", s1, s2)
fmt.Println(s)
Hello world
字符串分割
strings.Split()
按照指定子串对字符串进行分割,返回string类型切片
s := `Hello\world`
split := strings.Split(s, `\`)
fmt.Printf("%T\n", split)
fmt.Println(split)
[]string
[Hello world]
是否包含某子串
strings.Contains()
按照指定子串查找字符串是否包含该子串,返回bool类型
s := "Hello world"
fmt.Printf("%T\n", strings.Contains(s, " "))
fmt.Println(strings.Contains(s, " "))
bool
true
前后缀判断
strings.HasPrefix() 判断前缀
strings.HasSuffix() 判断后缀
s := "Hello world"
fmt.Println(strings.HasPrefix(s, "Hello"))
fmt.Println(strings.HasSuffix(s, "world"))
true
true
子串出现位置
strings.Index()
若找到子串,返回子串第一个字符的下标
若没有找到,返回-1
s := "Hello world"
fmt.Println(strings.Index(s, "o w"))
// 未找到子串返回-1
fmt.Println(strings.Index(s, "*"))
4
-1
join拼接
strings.Join()
对一个string类型切片使用指定字符串进行拼接
// join 拼接
s := `Hello\world`
split := strings.Split(s, `\`)
fmt.Println(strings.Join(split, "+"))
Hello+world
字符串无法直接修改
Go语言中,字符串无法直接修改,无法通过下标直接修改字符串中的某个字符,必须先将字符串转换位rune类型的切片才可以
s1 := "魚禾"
// 报错
// s1[0] = "鱼"
// 转换成rune切片
s := []rune(s1)
// s[0]属于字符型,使用单引号
// s[0] = "鱼"
s[0] = '鱼'
// 重新转换为string
s1 = string(s)
fmt.Println(s1)