字符串类型及其常用操作

1、字符串类型

字符串是一种值类型,且值不可变,即创建某个文本后将无法再次修改这个文本的内容,字符串是字节的定长数组。

1)定义字符串

可以使用双引号""来定义字符串,字符串中可以使用转义字符来实现换行、缩进等效果。

一般的比较运算符(==、!=、<、<=、>=、>)是通过在内存中按字节比较来实现字符串比较的,因此比较的结果是字符串自然编码的顺序。字符串所占的字节长度可以通过函数 len() 来获取。

字符串的内容(纯字节)可以通过标准索引法来获取,在方括号[]内写入索引,索引从 0 开始计数。

2)字符串拼接符“+”

两个字符串 s1 和 s2 可以通过 s := s1 + s2 拼接在一起。将 s2 追加到 s1 尾部并生成一个新的字符串 s。也可以使用“+=”来对字符串进行拼接。

示例:

package main

import "fmt"

func main() {
	var s1 = "hello" + ", world"
	var s2 = "hello" +
		", world"
	var s3 = "hello"
	s3 += ", world"
	fmt.Println(s1)
	fmt.Println(s2)
	fmt.Println(s3)
}

  

3)字符串实现基于UTF-8编码

Go语言中字符串的内部实现使用 UTF-8 编码,通过 rune 类型,可以方便地对每个 UTF-8 字符进行访问。当然,Go语言也支持按照传统的 ASCII 码方式逐字符进行访问。

4)定义多行字符串

在Go语言中,使用双引号书写字符串的方式是字符串常见表达方式之一,被称为字符串字面量(string literal),这种双引号字面量不能跨行,如果想要在源码中嵌入一个多行字符串时,就必须使用`反引号。

在这种方式下,反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

示例:

package main

import "fmt"

func main() {
	var str = `你好\n
		世界\n`
	fmt.Println(str)
}

  

2、计算字符串长度

len() 函数的返回值的类型为 int,表示字符串的 ASCII 字符个数或字节长度。

如果希望按习惯上的字符个数来计算,就需要使用 Go 语言中 UTF-8 包提供的 RuneCountInString() 函数,统计 Uncode 字符数量。

示例:

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	var s1 = "abc"
	var s2 = "你好a"
	fmt.Printf("s1: %v\n", len(s1)) // 3
	fmt.Printf("s2: %v\n", len(s2)) // 7
	fmt.Printf("s1: %v\n", utf8.RuneCountInString(s1)) // 3
	fmt.Printf("s2: %v\n", utf8.RuneCountInString(s2)) // 3
}

  

3、遍历字符串

ASCII 字符串遍历直接使用下标。
Unicode 字符串遍历用 for range。

示例:

package main

import "fmt"

func main() {
	var str = "你好,world"
	for i := 0; i < len(str) ; i++  {
		fmt.Printf("%c, %d\n", str[i], str[i])
	}
	fmt.Println("-------------------------")
	for _, s := range str{
		fmt.Printf("%c, %d\n", s, s)
	}
}

  

4、字符串截取

strings.Index:正向搜索子字符串。
strings.LastIndex:反向搜索子字符串。
搜索的起始位置可以通过切片偏移制作。

示例:

package main

import (
	"fmt"
	"strings"
)

func main() {
	var str = "你好, world, new"
	pos := strings.Index(str, ",")
	lastPos := strings.LastIndex(str, ",")
	fmt.Printf("pos = %d, lastPos=%d\n", pos, lastPos) // pos = 6, lastPos=13
}

  

5、修改字符串

Go 语言的字符串是不可变的。
修改字符串时,可以将字符串转换为 []byte 进行修改。
[]byte 和 string 可以通过强制类型转换互转。

示例:

package main

import "fmt"

func main() {
	var str = "hello, world"
	strBytes := []byte(str)
	for i := 5; i <= 6 ; i++  {
		strBytes[i] = '-'
	}
	fmt.Println(string(strBytes)) // hello--world
}

  

6、字符串拼接

除了加号连接字符串,Go 语言中也有类似于 StringBuilder 的机制来进行高效的字符串连接。

示例:

package main

import (
	"bytes"
	"fmt"
)

func main() {
	var stringBuilder bytes.Buffer // 声明字节缓冲
	// 把字符串写入缓冲
	stringBuilder.WriteString("hello,")
	stringBuilder.WriteString("世界")
	// 将缓冲以字符串形式输出
	fmt.Println(stringBuilder.String())
}

  

7、格式化输出

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

格式化样式:字符串形式,格式化动词以%开头。
参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。

示例:

package main

import "fmt"

func main() {
	name := "hello"
	str := fmt.Sprintf("%s, world", name)
	fmt.Println(str)
}

  

猜你喜欢

转载自www.cnblogs.com/ACGame/p/11871724.html