string 在Go中为只读类型,底层为字节数组,一个英文字符占一个字节。
strng 一旦赋值就不能修改。
// 允许
fmt.Println(str1[3])
// 错误
str1[3] = 'l'
一、字符串操作
1.字符串拼接
方式1:+ 号,由于字符串不可修改特性,实际上会产生一个新字符串作临时变量,性能较差。
//字符串拼接
str4 := str1 + str2
fmt.Println(str4)
方式2:s3 := fmt.Sprintf("%s%s", s1, s2)
方式3:strings.Join(str, “”)
方式4:调用bytes.buffer.WriteString函数
方式5:strings.Builder.WriteString
2.字符串长度
str := "hello我"
fmt.Println(len(str)) //8
可见一个汉字占了3个字节,所以长度不是我们想要的元素个数。
解决办法是在计算字符串长度时,将string
转换为rune数组
,再求len()
str := "hello我"
fmt.Println(len([]rune(str))) //6
3.字符串分割
将字符串分割成数组
str3 := "this is a hello"
ret := strings.Split(str3," ")//以空格分割字符串
fmt.Println(ret) //[this is a hello]
也可以将数组用指定分隔符再次拼接回字符串
//用分隔符将数组拼接
fmt.Println(strings.Join(ret,"+")) //this+is+a+hello
4.常用操作
先导入操作字符串的工具包 strings
//字符串比较
cmp := strings.Compare(str1, str2)//cmp=-1表示str1小于str2
//字符串包含
fmt.Print("是否包含")
fmt.Println(strings.Contains(str3,str1))
//匹配前缀、后缀
fmt.Println(strings.HasPrefix(str1,"he"))
fmt.Println(strings.HasSuffix(str2,"ld"))
//子串位置
fmt.Print("=====字串位置=====")
fmt.Println(strings.Index(str3,str1))
fmt.Println(strings.LastIndex(str3,"is"))
//替换
str := "aaaddc"
strings.Replace(str, "a", "b", 1) // baaddc 替换一次
strings.Replace(str, "a", "b", -1)//bbbddc 全部替换
//单引号与双引号
fmt.Println("=====单引号与双引号=====")
str5 := "呵"
str6 := '呵'
fmt.Printf("%T,%T\n",str5,str6)//string,int32
5.字符串类型转换
导入strconv
包
(1)字符串与整型、浮点型的转换
- 字符串转整型、浮点型
value, err := strconv.ParseInt("33225", 10, 32)//十进制,32位整型
if err != nil {
fmt.Println("error happens")
}
value, err := strconv.ParseFloat("33.33", 32)
if err != nil {
fmt.Println("error happens")
}
- 数字转字符串
num := 180
fmt.Println(strconv.FormatInt(int64(num), 16))//十六进制
(2)bool转字符串
参数只接受0, 1, t, f, T, F, ture, false, True, False, TRUE, FALSE这几种取值
flag, err := strconv.ParseBool('t')
if err != nil {
fmt.Println("error happens")
}
二、其他
1.rune 汉字
//遍历字符串
func traversalString() {
s := "hello世界"
//按byte遍历
for i := 0; i < len(s); i++ {
fmt.Printf("%v(%c) ", s[i], s[i])
}
//按rune遍历
fmt.Println()
for _, r := range s {
fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()
}
输出
104(h) 101(e) 108(l) 108(l) 111(o) 228(ä) 184(¸) 150() 231(ç) 149() 140()
104(h) 101(e) 108(l) 108(l) 111(o) 19990(世) 30028(界)
2.求字符串中中文数量
需要导入"unicode"包
//统计字符串中的中文数量
func ChineseCount(str string)(count int){
count = 0
for _,char := range str{
if unicode.Is(unicode.Han,char){
count++;
}
}
return count
}
统计中文个数(我的写法)
- 由于英文字符的
len==1
,但中文字符的len()=3
(中文字符由3byte组成) - 所以遍历字符串每个字符,统计长度等于3的字符个数。
func main(){
str := "abc你我他haha你好吃了么enen"
str3 := []rune(str)//类型转换,用于输出中文
count := 0
ret := strings.Split(str,"")//字符串分割成数组
fmt.Println(ret)
fmt.Print("字符串所有字符总数 :")
fmt.Println(len(ret))
//遍历判断每个字符的长度,匹配中文
for i := 0; i < len(ret); i++ {
if len(ret[i]) == 3{
count ++
fmt.Printf("%c ",str3[i])
//打印中文字符,不能使用%v,只会打印字节地址
//只能借助str3:rune类型打印,原始str类型显示不了中文
}
}
fmt.Println()
fmt.Print("中文字符个数 :")
fmt.Println(count)
}
修改字符串
字符串的修改,string类型一旦赋值就不能修改,若想修改只能通过类型转换。
把string->rune数组,修改索引对应的值
把string->byte数组,修改索引对应的值
//字符串的修改
fmt.Println("=====字符串的修改=====")
str7 := "红苹果"
str8 := []rune(str7)
str8[0] = '绿'
fmt.Printf(string(str8))
其实使用replace替换即可