string 在Go中为只读类型,底层为字节数组,一个英文字符占一个字节。
strng 一旦赋值就不能修改。

// 允许
fmt.Println(str1[3])// 错误
str1[3] = 'l'

一、字符串操作

1.字符串拼接

方式1:+ 号,由于字符串不可修改特性,实际上会产生一个新字符串作临时变量,性能较差。

//字符串拼接str4 := str1 + str2fmt.Println(str4)

方式2:s3 := fmt.Sprintf("%s%s", s1, s2)
方式3:strings.Join(str, “”)
方式4:调用bytes.buffer.WriteString函数
方式5:strings.Builder.WriteString

原文:golang中的字符串拼接

2.字符串长度

str := "hello我"
fmt.Println(len(str))	//8
stringrune数组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
  • 字符串转整型、浮点型
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 = 0for _,char := range str{if  unicode.Is(unicode.Han,char){count++;}}return count
}

统计中文个数(我的写法)

len==1len()=3
func main(){	str := "abc你我他haha你好吃了么enen"str3 := []rune(str)//类型转换,用于输出中文count := 0ret := 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替换即可