教程 > Go 教程 > Go 基础 阅读:176

Go 语言字符串详解

本章节对Go语言中的字符串进行一个详解。

在 Go 编程中广泛使用的字符串是只读的字节片。在 Go 编程语言中,字符串本质上是切片(slice)。Go 平台提供了多种多样的库来操作字符串。

  • unicode
  • regexp
  • strings

创建字符串

创建字符串的最简单的方法就是给变量直接赋值一个字符串

var greeting = "Hello World!"

下面让我们看一个简单的示例

package main

import (  
    "fmt"
)

func main() {  
    greeting := "Hello World!"
    fmt.Println(name)
}

运行示例

上述代码编译执行结果如下

Hello World!

每当在代码中遇到字符串文字时,编译器都会创建一个字符串对象,在这种情况下,它的值是“Hello World!”。

字符串字面量包含一个有效的 UTF-8 序列,称为符文。字符串包含任意字节。

package main

import "fmt"

func main() {
   var greeting =  "Hello world!"
   
   fmt.Printf("normal string: ")
   fmt.Printf("%s", greeting)
   fmt.Printf("\n")
   fmt.Printf("hex bytes: ")
   
   for i := 0; i < len(greeting); i++ {
       fmt.Printf("%x ", greeting[i])
   }
   
   fmt.Printf("\n")
   const sampleText = "\xbd\xb2\x3d\xbc\x20\xe2\x8c\x98" 
   
   /*q标志转义不可打印字符,使用+标志转义非ascii字符的字符,以使输出明确无误 */
   fmt.Printf("quoted string: ")
   fmt.Printf("%+q", sampleText)
   fmt.Printf("\n")  
}

运行示例

上述代码执行结果如下

normal string: Hello world!
hex bytes: 48 65 6c 6c 6f 20 77 6f 72 6c 64 21 
quoted string: "\xbd\xb2=\xbc \u2318"

注意- 字符串文字是不可变的,因此一旦创建字符串文字就无法更改。


访问字符串的单个字节

由于字符串是字节的切片,因此可以对字符串的每一个字节进行访问。

package main

import (  
    "fmt"
)

func printBytes(s string) {  
    fmt.Printf("Bytes: ")
    for i := 0; i < len(s); i++ {
        fmt.Printf("%x ", s[i])
    }
}

func main() {  
    greeting := "Hello World!"
    fmt.Printf("String: %s\n", greeting)
    printBytes(greeting)
}

运行示例

%s 是打印字符串的格式说明符。len(s) 返回字符串中的字节数,我们使用for 循环以十六进制表示法打印这些字节。%x 是十六进制的格式说明符。

上述代码编译执行结果如下

String: Hello World  
Bytes: 48 65 6c 6c 6f 20 57 6f 72 6c 64  

访问字符串的单个字符

让我们稍微修改一下上面的程序来打印字符串的字符。

package main

import (  
    "fmt"
)

func printBytes(s string) {  
    fmt.Printf("Bytes: ")
    for i := 0; i < len(s); i++ {
        fmt.Printf("%x ", s[i])
    }
}

func printChars(s string) {  
    fmt.Printf("Characters: ")
    for i := 0; i < len(s); i++ {
        fmt.Printf("%c ", s[i])
    }
}

func main() {  
    greeting := "Hello World!"
    fmt.Printf("String: %s\n", greeting)
    printChars(greeting)
    fmt.Printf("\n")
    printBytes(greeting)
}

运行示例

上述代码编译执行结果如下

String: Hello World!
Characters: H e l l o   W o r l d ! 
Bytes: 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 

警告:虽然上面的程序看起来是访问字符串单个字符的合法方式,但这有一个严重的错误。上面的程序没有考虑字符串中一个字符占多字节的情况,例如 中文。这种情况我们会在后面的章节中单独介绍,然后给出解决方案。这里大家也可以自己尝试解决。


字符串长度

len(str) 方法返回字符串文字中包含的字节数。

package main

import "fmt"

func main() {
   var greeting =  "Hello World!"
   
   fmt.Printf("字符串长度是: ")
   fmt.Println(len(greeting))  
}

运行示例

上述代码执行结果如下

字符串长度是:12

连接字符串

Strings 包中有一个用于连接多个字符串的方法 join

strings.Join(sample, " ")

Join 连接数组的元素以创建单个字符串。第二个参数是分隔符,它位于数组元素之间。

让我们看看下面的例子

package main

import ("fmt" "math" )"fmt" "strings")

func main() {
   greetings :=  []string{"Hello","world!"}   
   fmt.Println(strings.Join(greetings, " "))
}

运行示例

上述代码编译执行结果如下

Hello World!

查看笔记

扫码一下
查看教程更方便