字符串应用
- 字符串操作
- 拼接
- 截取
- 修改
- 格式化输出
1.字符串拼接
package main
import "fmt"
func main(){
a := "012134"
b := "567890"
fmt.Println(a + b)
}
执行结果:
012134567890
然而,当需要拼接的字符串较长时,使用“+”操作符进行字符串的拼接并不高效,因此推荐使用字节缓冲的方式来进行。
package main
import (
"fmt"
"bytes"
"reflect"
)
func main(){
a := "012134"
b := "567890"
var c bytes.Buffer //声明变量c,类型为字节缓冲
c.WriteString(a) //写入字符串变量a内容
c.WriteString(b) //写入字符串变量b内容
fmt.Println(c.String())
fmt.Println(reflect.TypeOf(c))
}
执行结果:
012134567890
bytes.Buffer
其中bytes包中的Buffer数据结构如下,其本质是字节数组,字符串本质上也是一种字节数组,可以通过WriteString()方法来写入。
type Buffer struct {
buf []byte
off int
bootstrap [64]byte
lastRead readOp
}
2.字符串截取
字符串的截取是开发中经常遇到的场景,开发者需要截取目标字符串的某一段内容。Go语言中的strings包的Index()方法会从头对字符串进行搜索,获得搜索内容所属下标,完成对字符串的截取。
package main
import (
"fmt"
"strings"
)
func main(){
str := "go语言"
index := strings.Index(str,"语")
fmt.Println(index)
fmt.Println(str[index:])
}
执行结果:
2
语言
另外,strings包中还提供了LastIndex()方法来反向搜索字符串。例如,我们只想截取字符串“go语言,Python语言”中最后的“语言”,就可以使用LastIndex()方法。
package main
import (
"fmt"
"strings"
)
func main(){
str := "go语言,Python语言"
index := strings.LastIndex(str,"语")
fmt.Println(index)
fmt.Println(str[index:])
}
执行结果:
15
语言
注意
在 Go 语言中,一个中文字符通常被表示为一个 Unicode 字符,占用 4 个字节的存储空间。Unicode 使用 UTF-8 编码,其中每个字符的字节数可以根据字符的不同而变化。
虽然一个中文字符在存储时占用 4 个字节,但在字符串中使用 len() 函数计算长度时,会将一个中文字符计算为 3。这是因为在 UTF-8 编码中,一个中文字符需要 3 个字节来编码。
这就是为什么这里最后一个“语”的index为15的原因
3.修改字符串
Go语言无法对字符串直接进行修改,只能将字符串转换为字节数组后再进行操作。
package main
import "fmt"
func main(){
str := "Go语言"
newStr := []byte(str)
fmt.Println(string(newStr))
}
执行结果:
Go语言
在这个示例中,字符串 str 包含中文字符 "Go语言"。通过使用 []byte() 函数,我们将字符串转换为字节数组。然后,通过使用 string() 函数,我们将字节数组重新转换为字符串 newStr,最终输出为 "Go语言"。
这种转换过程是因为在 Go 中,字符串是不可变的,但字节数组可以进行修改。在进行字符串和字节数组之间的转换时,需要注意字符编码(例如 UTF-8)的影响,以及一些特殊字符可能在转换中引起的问题。
4.字符串格式化输出
对字符串的格式化使用fmt包的Sprintf()方法,Sprintf()方法的调用格式如下:
Sprintf(format,arg1,arg2...)
第一个参数为需要格式化的字符串,其中包含格式化动词,格式化动词以“%”开头。
package main
import "fmt"
func main(){
month := 2
day := 1
str := fmt.Sprintf("今天是%d月%d日",month,day)
fmt.Println(str)
}
执行结果:
今天是2月1日
程序中需要格式化的字符串为“今天是%d月%d日”,其中两个“%d”代表整型以十进制方式显示,传入的实参month和day从左至右与需要格式化字符串的两个动词相对应。