作者:看那个码农
公众号:看那个码农
上期内容介绍了Go语言学习之常用包整理|Go主题月
- Go语言的常用包
本篇内容将继续带领大家走进Go语言的世界。
1.本文简介
Go语言的字符串应用
常见的字符串应用有
- 计算字符串长度
- 遍历字符串,获取每个字符串字符
- 获取字符串的某一段字符
- 修改字符串
- 连接字符串
- 格式化
下面我们就来看看这些用法
2.计算字符串长度
在Go语言中,常使用内建函数len(),来获取ASCII字符串的字符个数或字节长度,该函数的返回值类型是int
例如下面案例所示:
package main
import "fmt"
func main() {
sentence1 :="HelloWorld"
fmt.Println(len(sentence1))
sentence2:="你好"
fmt.Println(len(sentence2))
}
输出为
- 输入的第一行
“HelloWorld”
的字符个数为16 - 输入的第二行
“你好”
的字符个数为6
这个是因为Go语言的字符串都已UTF-8的格式保存,每个中文占用3个字符。
因此使用len()获取两个中文文字字符的长度就为6
那怎么办呢?
这里就需要使用Go语言中UTF-8包提供的RunCountInString()
函数,统计Uncode字符数量
例如下面案例所示:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
sentence1 :="HelloWorld"
fmt.Println(len(sentence1))
sentence2:="你好"
fmt.Println(len(sentence2))
sentence3:="你好,世界!"
fmt.Println(utf8.RuneCountInString(sentence3))
}
输出为
我们可以看见第三个输入的字符串长度,被合理地计算了出来。
根据以上案例,我们做个总结:
- 若是ASCII字符串长度统计,我们可以使用
len()
函数。 - 若是Unicode字符串长度统计,我们可以使用
utf8.RuneCountInString()
函数。
3.遍历字符串-获取每个字符串元素
由于Go语言的字符串都以UTF-8格式保存,每个中文占用3个字符
所以在遍历字符串的时候,我们需要用Unicode字符遍历字符串,这样才能让汉字不被显示为乱码。
例如下面案例所示:
package main
import (
"fmt"
)
func main() {
sentence1 :="HelloWorld.你好,世界!"
for _,s :=range sentence1{
fmt.Printf("Unicode字符统计:%c,%d\n",s,s)
}
}
输出为
后面的一串文字是表示该字符在Unicode码表的序号
4.获取字符串的某一段字符
获取字符串中某一段字符是常见的开发操作。
Go语言通常将字符串中的某一段字符称为“子串“
我们用一个例子来说明一下:
package main
import (
"fmt"
"strings"
)
func main() {
sentence1 :="你好,世界.你好,重庆."
node1 := strings.Index(sentence1,",")
node2 := strings.Index(sentence1[node1:],"你好")
fmt.Println(node1,node2,sentence1[node1+node2:])
}
输出为
node1 := strings.Index(sentence1,",")
执行的是在字符串中搜索英文的逗号“,“命令。返回的位置存在node1中,因为逗号之前有”你好“,两个中文,每个中文占3个字符,所以返回的是6
node2 := strings.Index(sentence1[node1:],"你好")
该代码是将从node1位置开始到sentence1字符串结尾处构造一个子字符串,也称为“子串”。此时构造出来的子字符串为,世界.你好,重庆.
我们用代码输出进行验证
package main
import (
"fmt"
"strings"
)
func main() {
sentence1 :="你好,世界.你好,重庆."
node1 := strings.Index(sentence1,",")
fmt.Println(sentence1[node1:])
}
输出为
“,世界.
“一共8个字符
5.修改字符串
Go语言的字符串无法直接修改每一个字符元素,只能重新构造新的字符串,通过遍历的形式修改字符串。
例如下面的案例所示:
package main
import (
"fmt"
)
func main() {
sentence1 :="To be better"
sentence2 :=[]byte(sentence1)
for i:=2;i<=5;i++{
sentence2[i]=' '
}
fmt.Println(string(sentence2))
}
输出为
上面这个案例是实现将删除字符串中的“be
“
通过上述过程,我们可以感受到,Go语言修改字符串 的过程比较艰辛
- 先定义了一个切片变量
[]byte
,因为[]byte
切片变量在Go语言中是可变的。 - 将字符串的值赋给切片,通过遍历的形式对切片进行处理后我们又将
[]byte
变量转为字符串,重新创造一个字符串,并输出。
6.连接字符串
1.连接方式-使用“+“
Go语言与大多数编程语言一样,可以使用“+
“对字符串进行连接操作
例如下面的案例所示:
package main
import (
"fmt"
)
func main() {
sentence1 :="To be better "
sentence2 :="Good Boy!"
sentence3 :=sentence1+sentence2
fmt.Println(sentence3)
}
输出为
最后输出的sentence3是将sentence1和sentence2合并后的结果
2.连接方式-使用byte.Buffer
除了使用“+
“号连接字符串,Go语言还能通过字节缓冲
的形式连接
例如下面的案例所示
package main
import (
"bytes"
"fmt"
)
func main() {
sentence1 :="To be better "
sentence2 :="Good Boy!"
//声明字节缓冲
var stringbuild bytes.Buffer
//将字符串写入缓冲
stringbuild.WriteString(sentence1)
stringbuild.WriteString(sentence2)
//将缓冲以字符串形式输出
fmt.Println(stringbuild.String())
}
输出为
7.格式化
格式化在字符串中很常用。常用来表示变量的不同类型值的输出
格式化用法如下:
fmt.Sprintf(格式化样式,参数列表)
- 格式化样式:字符串样式,格式化动词以%开头
- 参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则会发生运行出错
字符串格式化时的动词及其功能如下所示:
动词 | 功能 |
---|---|
%v | 按值的原来值输出 |
%+v | 在%v基础上,对结构体字段名和值进行展开 |
%#v | 输出Go语言语法格式的值 |
%T | 输出Go语言语法格式的类型和值 |
%% | 输出%本体 |
%b | 整型以二进制方式显示 |
%o | 整型以八进制方式显示 |
%d | 整型以十进制方式显示 |
%x | 整型以十六进制方式显示 |
%X | 整型以十六进制、字母大写方式显示 |
%U | Unicode字符 |
%f | 浮点数 |
%p | 指针,十六进制方式显示 |
例如下面的案例所示:
package main
import "fmt"
func main() {
var node1 = 2
var node2 = 4
var str ="Hello"
output :=fmt.Sprintf("离吃重庆酸辣粉还有%d天,离吃重庆老火锅还有%d天",node1,node2)
fmt.Println(output)
output2 :=fmt.Sprintf("%v,%v,%v",str,node1,node2)
fmt.Println(output2)
}
输出为
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情