Golang 字符串:完整指南

Golang 字符串与其他编程语言相比是不同的。 Go 中的字符串是字节片。 我们可以通过将它们的内容包含在“”(双引号)而不是“”(单引号)中来创建字符串。

Golang 字符串

UTF-8 字符的内存大小可以定义为 1 字节(ASCII 兼容)到 4 字节。

因此,在 Go 中,所有字符都以 int32(4 字节大小)数据类型表示。

编码单位是编码用于单个单位单元的位数。

所以 UTF-8 使用 8 位,而 UTF-16 使用 16 位作为代码单元,这意味着 UTF-8 至少需要 8 位或 1 个字节来表示字符。

代码点是定义字符的任何数值,由一个或多个代码单元表示,具体取决于编码。

由于 UTF-8 与 ASCII 兼容,所有 ASCII 字符都以单个字节(8 位)表示; 因此,UTF-8 只需要 1 个代码单元来表示它们。

对于标准 Go 编译器,任何字符串类型的内部结构都声明如下。

type _string struct {
	elements *byte // underlying bytes
	len      int   // number of bytes
}

从声明中,我们知道字符串是一个字节序列盘点器。 我们可以将字符串视为(元素不可变)字节切片。

请注意,在 Go 中,字节是 uint8 类型的内置别名。

现在,让我们看一下 Go 中字符串的示例。

// hello.go

package main

import (
	"fmt"
)

func main() {
	name := "Baby Yoda"
	fmt.Println(name)
}

输出

➜  hello go run hello.go
Baby Yoda
➜  hello

在上面的代码中,我们将名称定义为一个字符串,然后使用 Println() 函数在控制台中打印该字符串。

Go 中的字符串默认是 UTF-8 编码的,这在当前的数字世界中更有意义。

由于 UTF-8 支持 ASCII 字符集,因此在大多数情况下您无需担心编码问题。

如何在 Go 中查找字符串长度

我们可以使用 len() 函数找到字符串的长度。

// hello.go

package main

import (
	"fmt"
)

func main() {
	name := "Baby Yoda"
	fmt.Println("String length of Baby Yoda is: ", len(name))
}

输出

➜  hello go run hello.go
String length of Baby Yoda is:  9
➜  hello

字符串 len() 函数将空格计为一个字符; 这就是为什么输出是 9 而不是 8。

字符串“Baby Yoda”中的所有字符都是有效的 ASCII 字符; 因此,我们希望看到每个字符只占用内存中的一个字节。

Golang len() 是一个通用函数,用于查找任何数据类型的长度,它不是特定于字符串的。

如何在 Go 中访问字符串的字符(字节)

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

请参阅以下代码。

// hello.go

package main

import (
	"fmt"
)

func accessBytes(str string) {
	for i := 0; i < len(str); i++ {
		fmt.Printf("%c \n", str[i])
	}
}

func main() {
	name := "Baby Yoda"
	accessBytes(name)
}

输出

➜  hello go run hello.go
B
a
b
y

Y
o
d
a
➜  hello

我们已经使用 for 循环逐个字节地循环字符串并使用 %c 显示它以打印字符串的字符或字节。

在 Go 中,字符串实际上是一个只读的字节片。

现在,想象一个切片就像一个简单的数组。 因此,在上述情况下,我们看到字符串 str 的字节 (uint8) 值,它在内部是一个切片。

因此 str[i] 打印字符保存的字节的十进制值。 但要查看单个字符,您可以在 Printf 语句中使用 %c 格式字符串。

如果您不知道如何格式化字符串,请查看格式化 I/O 示例。

%c 格式说明符用于打印字符串的字符。

从 Go 中的字节切片构造字符串

好的,让我们采用 UTF-8 解码值并从该 UTF-8 解码值构造字符串。

// hello.go

package main

import (
	"fmt"
)

func main() {
	byteSlice := []byte{0x42, 0x61, 0x62, 0x79, 0x20, 0x59, 0x6F, 0x64, 0x61}
	str := string(byteSlice)
	fmt.Println(str)
}

输出

➜  hello go run hello.go
Baby Yoda
➜  hello

如何修改 Golang 字符串

我们不能修改或更改 Golang 中的字符串。 字符串在 Golang 中是不可变的。 一旦创建了字符串,就无法更改它。

请参阅以下代码。

// hello.go

package main

import (
	"fmt"
)

func mutate(str string) string {
	str[0] = 'M'
	return str
}

func main() {
	data := "Netflix"
	fmt.Println(mutate(data))
}

输出

➜  hello go run hello.go
# command-line-arguments
./hello.go:8:9: cannot assign to str[0]
➜  hello

从输出中可以看出,我们不能将任何字符(字节)分配给已经创建的字符串。

我们可以解决这个字符串不变性。

首先,我们需要将字符串转换成一片符文。

然后,该切片会根据所需的更改进行变异并转换回新字符串。

请参阅以下代码。

// hello.go

package main

import (
	"fmt"
)

func mutate(str []rune) string {
	str[0] = 'M'
	return string(str)
}

func main() {
	data := "Netflix"
	fmt.Println(mutate([]rune(data)))
}

输出

➜  hello go run hello.go
Metflix
➜  hello

在上面的程序中, mutate 函数接受一个符文切片作为参数。

然后它将切片的第一项更改为“M”,将符文转换回字符串,然后返回。

调用 mutate() 方法,将数据转换为 rune 切片并传递给 mutate。 该程序输出 Netflix。

现在,Go 中的符文到底是什么? 让我们详细讨论一下。

Golang 符文示例

正如我们在本文中看到的,字符串是字节的一部分。

当我们使用带范围的 for 循环时,我们会得到 rune,因为字符串中的每个字符都由 rune 数据类型表示。

在 Golang 中,一个字符在单引号 AKA 字符文字之间表示。

因此,单引号 (‘) 中的任何有效 UTF-8 字符都是符文,其类型为 int32。

请参阅以下代码。

// hello.go

package main

import (
	"fmt"
)

func main() {
	data := 'Δ'
	fmt.Printf("%x \n", data)
	fmt.Printf("%v \n", data)
	fmt.Printf("%T", data)
}

输出

➜  hello go run hello.go
394
916
int32                                                                                                                                                                                                       
➜  hello

上述程序将打印UTF-8表中Δ的码位值的395、916、int32、十六进制/十进制值和数据类型。

要记住的一点是,我们将符号放在单引号 ‘ ‘ 中,如果我们将其更改为双引号,我们将在输出中得到字符串,它不会是符文。

Go 中的字符串字面量

除了双引号,我们还可以使用反引号 (`) 字符来表示 Go 中的字符串。

在引号 (“) 中,您需要转义换行符、制表符和其他不需要在反引号中转义的字符。

请参阅以下示例。

// hello.go

package main

import "fmt"

func main() {
	data := `Maeve Wiley
  and Otis Milburn`
	fmt.Println(data)
}

输出

➜  hello go run hello.go
Maeve Wiley
  and Otis Milburn
➜  hello

所以,我们不需要使用“\n”来换行。 它将自动检测反引号中的下一行和制表符。

结论

字符串值可以用作常量。

Golang 支持两种样式的字符串文字,双引号样式或解释文字和反引号样式或原始字符串文字。

字符串类型的零值是空字符串,可以用“”(双引号)或` `(反引号)字面量表示。

字符串可以与 + 和 += 运算符连接。

Go 中的字符串是不可变的。 字符串值的长度也不能单独修改。 一个可寻址的字符串值只能通过为其分配另一个字符串值来整体覆盖。

Unicode 标准规定了各种人类语言中每个字符的唯一值。 但是Unicode中的基本单位不是字符,而是一个码位。 对于大多数码点来说,每个码点对应一个字符,但对于少数字符来说,每个码点都由许多码点组成。 代码点在 Go 中表示为符文值。 在 Go 中,rune 是 int32 类型的内置别名。

您可以在官方文档中找到有关字符串和字符串函数的更多信息:strings。

终于,Golang Strings Example 结束了。

Golang String: The Complete指南 一文首次出现在 AppDividend 上。

资讯来源:由0x资讯编译自APPDIVIDEND,版权归作者Krunal所有,未经许可,不得转载
你可能还喜欢