Go语言学习之字符串应用|Go主题月

474 阅读3分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了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))
}

输出为

image.png

  • 输入的第一行“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))

}

输出为

image.png

我们可以看见第三个输入的字符串长度,被合理地计算了出来。

根据以上案例,我们做个总结:

  • 若是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)
}
}

输出为

image.png

后面的一串文字是表示该字符在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:])
}

输出为

image.png

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:])

}

输出为

image.png

,世界.“一共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))
}

输出为

image.png

上面这个案例是实现将删除字符串中的“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)
}

输出为

image.png

最后输出的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())
}

输出为

image.png

7.格式化

格式化在字符串中很常用。常用来表示变量的不同类型值的输出

格式化用法如下:

fmt.Sprintf(格式化样式,参数列表)

  • 格式化样式:字符串样式,格式化动词以%开头
  • 参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则会发生运行出错

字符串格式化时的动词及其功能如下所示:

动词功能
%v按值的原来值输出
%+v在%v基础上,对结构体字段名和值进行展开
%#v输出Go语言语法格式的值
%T输出Go语言语法格式的类型和值
%%输出%本体
%b整型以二进制方式显示
%o整型以八进制方式显示
%d整型以十进制方式显示
%x整型以十六进制方式显示
%X整型以十六进制、字母大写方式显示
%UUnicode字符
%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)

}

输出为

image.png

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情