GO语法基础(2):字符串、rune、strings工具包

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

原文:golang中的字符串拼接

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替换即可

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_popo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值