← 返回首页
Go基础教程(六)
发表时间:2022-11-01 23:48:23
字符串

字符串是一个不可改变的字节序列,类型为原生数据类型,同 int、bool、float32、float64 是一样的。

1.字符串常用API

函数 说明
len() 可以获取字符串字节数组的长度。
RuneCountInString() 可以获取字符串字符的长度。

Go 语言的字符串都以UTF-8 格式保存,每个中文占用3个字节,所以 "牛牛编程"占用12个字节。

package main

import (
    "fmt"
    "unicode/utf8"
    _ "unicode/utf8"
)

func main() {
    str1 := "www.simoniu.com"
    fmt.Println("字节数组长度:", len(str1))
    fmt.Println("字符个数:", utf8.RuneCountInString(str1))

    str2 := "牛牛编程"
    fmt.Println("字节数组长度:", len(str2))
    fmt.Println("字符个数:", utf8.RuneCountInString(str2))

    str3 := "牛牛编程 www.simoniu.com"
    for _, s := range str3 {
        fmt.Printf("Unicode: %c %d\n", s, s)
    }
}

运行结果:

字节数组长度: 15
字符个数: 15     
字节数组长度: 12 
字符个数: 4      
Unicode: 牛 29275 
Unicode: 牛 29275 
Unicode: 编 32534 
Unicode: 程 31243 
Unicode:   32     
Unicode: w 119    
Unicode: w 119    
Unicode: w 119    
Unicode: . 46     
Unicode: s 115    
Unicode: i 105    
Unicode: m 109    
Unicode: o 111    
Unicode: n 110    
Unicode: i 105    
Unicode: u 117    
Unicode: . 46     
Unicode: c 99     
Unicode: o 111    
Unicode: m 109  

2.获取子串

可以通过 str[i:j] 基于原始的 str 字符串的第 i 个字节开始到第 j 个字节(并不包含 j 本身)生成一个新字符串。生成的新字符串将包含 j-i 个字节。

不管 i 还是 j 都可以不填写,若不填写,将采用0作为开始位置,采用len(s)作为结束的位置。

package main

import (
    "fmt"
    "strings"
    _ "unicode/utf8"
)

func main() {

    str1 := "牛牛编程 www.simoniu.com"
    fmt.Println(str1[0:12]) // 输出 牛牛编程

    // 通过 strings.Index() 函数获取字符 . 的下标
    index := strings.Index(str1, "程")
    fmt.Println("index=", index)
    fmt.Println(str1[0 : index+3]) // 输出 牛牛编程

    str2 := "simoniu.com"
    fmt.Println(str2[:7]) // "simoniu"
    fmt.Println(str2[7:]) // ".com"
    fmt.Println(str2[:])  // "simoniu.com"
}

运行结果:

牛牛编程
index= 9    
牛牛编程    
simoniu     
.com        
simoniu.com 

3.修改字符串

与Java语言类似,Go 语言中,无法直接修改字符串中的字符,只能通过重新构造一个新的字符串并赋值给原来的字符串实现:

例如:

package main

import (
    "fmt"
    _ "unicode/utf8"
)

func main() {

    str := "simoniu.com"

    // 将字符串转换为字符串数组
    strBytes := []byte(str)
    fmt.Println("修改前长度:", len(str))
    // 将.com 替换为空格
    for i := 7; i < len(str); i++ {
        strBytes[i] = ' '
    }
    fmt.Println(string(strBytes))
    fmt.Println("修改后长度:", len(string(strBytes)))
}

运行结果:

修改前长度: 11
simoniu         
修改后长度: 11 

4.拼接字符串

Go 语言同绝大数其他语言一样,通过操作符 + 可以将两个字符串连接构造一个新字符串:

package main

import (
    "fmt"
    _ "unicode/utf8"
)

func main() {
    str := "simoniu.com"
    // .com修改为.net
    str = str[0:8] + "net"
    fmt.Println(str)
}

运行结果:

simoniu.net

除了使用 + 来拼接字符串,Go 语言中也有类似于 Java 语言中 StringBuilder 的机制,来进行更高效率的字符串拼接, 上面的例子代码改写如下:

package main

import (
    "bytes"
    "fmt"
    _ "unicode/utf8"
)

func main() {

    str1 := "simoniu.com"
    str2 := "net"
    // 声明字节缓冲
    var stringBuilder bytes.Buffer

    // 将字符串写入缓冲
    stringBuilder.WriteString(str1[0:8])
    stringBuilder.WriteString(str2)
    // 将缓冲以字符形式输出
    fmt.Println(stringBuilder.String())
}

5.字符串比较

字符串可以用 == 、 <、> 进行比较;比较通过逐个字节比较完成的,因此比较的结果是字符串自然编码的顺序。

package main

import (
    "fmt"
    _ "unicode/utf8"
)

func main() {

    str1 := "simoniu.com"
    str2 := "simoniu.net"
    str3 := "simoniu.com"
    // 是否相等标志位
    isSame := false
    if str1 == str2 {
        isSame = true
    }
    fmt.Println(isSame)

    if str1 == str3 {
        isSame = true
    }
    fmt.Println(isSame)
}

运行结果:

false
true 

6.字符串转义符

与其它语言类似,常见转义符包括回车、换行、单双引号、制表符等:

转义符 含义
\r 回车符
\n 换行符
\t 制表符
\' 单引号
\'' 双引号
\ 反斜杠

7.格式化输出

字符串格式化应用场景十分丰富,格式如下:

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

import (
    "fmt"
)

func main()  {
    a := 100
    b := 200

  // 两整型参数格式化
  fmt.Printf("第一个数: %d, 第二个数: %d\n", a, b)

    str1 := "hello "
    str2 := "simoniu.com"

  // 两字符串参数格式化
    content := fmt.Sprintf("1: %s, 2: %s\n", str1, str2)

    fmt.Println(content)
}

小结: