相关文章推荐
含蓄的紫菜汤  ·  CMake projects in ...·  1 年前    · 
打盹的课本  ·  c# - Binding two ...·  1 年前    · 

今天在写代码的时候,遍历Golang中的字符串时候,发现竟然和想象中不同,从而认真研究了一下,做个记录希望与string做一个了断,这是一篇实战贴。

你将知道以下知识点:

1.字符串的 组成

2.如何 遍历 字符串?

3.如何将字符串与 整型互转

4.如何 改变 其中某个字符?

5.如何 截取 字符串?

6.如何计算 长度

7.如何 连接 字符串?

1.字符串的 组成

Golang的字符串都是由 单个字节连接起来的,每个字节都是UTF8编码标识的Unicode文本 。(不需要在考虑中文不兼容问题)

2.如何 遍历 字符串?

先看一个例子:

var str = "123"
for i := 0; i < len(str); i++ {
	fmt.Println(str[i])
复制代码

输出:

复制代码

我去,和想象中不太一样,接着看下面。

遍历有两种方式: 1.for i:=0;i<len;i++{} 2.for k,v:=range string {}

区别在于 第一种遍历的事ASCII字符,第二种是Unicode字符 ,当遇到汉字的时候第一种就会乱码了。这也就解释了前文为啥不是输出123了,需要格式化ASCII码才是我们想看到的。

var str = "123咖啡色的羊驼"
for i := 0; i < len(str); i++ {
	fmt.Printf("%c\n", str[i])
复制代码

输出:

’...(后面是乱码) 复制代码

这里乱码原因需要解释下: 在遍历的时候,ASCII字符只需要一个字节,而非ASCII 字符的可能需要不2或者3、4个字节不固定,所以碰到非ASCII 字符的用str[i]来获取一个字节,获取的不全,肯定就乱码了。

有什么办法解决乱码呢? 那就是 转为rune类型的切片 就好了

var str = "123咖啡色的羊驼"
strRune := []rune(str)
for _, v := range strRune {
	fmt.Printf("%c\n", v)
复制代码

输出:

复制代码

因为在Golang中 字符类型实际存储使用rune的

var str = "123咖啡色的羊驼"
for _, v := range str {
	fmt.Printf("%c\n", v)
复制代码

输出:

复制代码

3.如何将字符串与 整型互转

若全为ASCII字符,则 len(str) 。 若存在非ASCII的Unicode字符,则 utf8.RuneCountInString(str) 。 //字符串中字符全为ASCII中的字符 len(str) //字符串中含非ASCII的Unicode字符 utf8.RuneCountInString(str)

7.如何 连接 字符串?

提供三种方式:

第一种(最简单):使用+

str1 := "123"
str2 := "咖啡色的羊驼"
fmt.Println(str1 + str2)

第二种(最高效):使用字节拼接

str1 := "123"
str2 := "咖啡色的羊驼"
var buf bytes.Buffer
buf.WriteString(str1)
buf.WriteString(str2)
fmt.Println(buf.String())

第三种:使用系统包

str1 := "123"
str2 := "咖啡色的羊驼"
str := strings.Join([]string{str1,str2},"")
fmt.Println(str)
os.Exit(1)
        转转技术团队
                         
私信