Go基础之字符串拓展应用 | 青训营

175 阅读3分钟

字符串应用

  • 字符串操作
    • 拼接
    • 截取
    • 修改
    • 格式化输出

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)
}

执行结果:

今天是21

程序中需要格式化的字符串为“今天是%d月%d日”,其中两个“%d”代表整型以十进制方式显示,传入的实参month和day从左至右与需要格式化字符串的两个动词相对应。

常用格式化动词及其功能对照

image.png