字符串类型
Go 语言中的字符串是一个字节切片。把内容放在双引号""之间,我们可以创建一个字符串。并且字符串是不可变的。
以下是一个简单的示例:
package main
import (
"fmt"
)
func main() {
name := "Hello World"
fmt.Println(name)
}
Go 中的字符串是兼容 Unicode 编码的,并且使用 UTF-8 进行编码
字符串的操作
字符串的操作原则需要记住:
1)字符串是一个字节切片,所以我们可以获取字符串的每一个字节。
2)字符串是不可变的。
获取字符串的单个字节
使用for循环获取,每一个字节
package main
import (
"fmt"
)
func printBytes(s string) {
for i:= 0; i < len(s); i++ {
fmt.Printf("%x ", s[i]) //使用16进制输出
fmt.Printf("%c\n", s[i]) //使用字符打印输出
}
}
func main() {
name := "Hello World"
printBytes(name)
fmt.Printf("%c",name[1]) //输出e
}
输出
48 H
65 e
6c l
6c l
6f o
20
57 W
6f o
72 r
6c l
64 d
len(s) 返回字符串中字节的数量,然后我们用了一个 for 循环以 16 进制的形式打印这些字节。%x 格式限定符用于指定 16 进制编码。
字符串的 for range 循环
上面的程序是一种遍历字符串的好方法,但是 Go 给我们提供了一种更简单的方法来做到这一点:使用 for range 循环。runne是int32的别名,表示一个代码点(多字节)
package main
import (
"fmt"
)
func printCharsAndBytes(s string) {
for index, rune := range s {
fmt.Printf("%c starts at byte %d\n", rune, index)
}
}
func main() {
name := "Señor"
printCharsAndBytes(name)
}
输出:
S starts at byte 0
e starts at byte 1
ñ starts at byte 2
o starts at byte 4
r starts at byte 5
在上面程序中的第8行,使用 for range 循环遍历了字符串。循环返回的是是当前 rune 的字节位置。程序的输出结果为:
字符串的拼接
func main() {
name := "Hello World"
//printBytes(name)
fmt.Printf("%c",name[1])
name = name + "aaa" //直接拼接两个字符串,字符串不可更改。但字符串变量是能够被重新赋值。所以name是能够被赋值新的字符串常量的。
fmt.Println(name) //输出 Hello Worldaaa
}
其他更多操作
另外别的对于string更多的操作,使用strings包进行操作。
package main
import (
"fmt"
"strings"
)
func main() {
s1 := " aBc"
s2 := "100a"
s3 := s1 + s2
fmt.Println(s3)
fmt.Println(strings.Contains(s3, "9")) //字符串包含关系
fmt.Println(strings.Index(s3, "0")) //判断子字符串或字符在父字符串中出现的位置(索引)
fmt.Println(strings.LastIndex(s3, "0")) //最后出现位置的索引
fmt.Println(strings.ToLower(s3))//修改字符串大小写
fmt.Println(strings.ToUpper(s3))//修改字符串大小写
var splits = strings.Split("annbnnc", "nn") //拆分字符串3
var splits = strings.Split("a,b,c", ",")
fmt.Println(strings.HasPrefix(s3, "a")) //判断前缀
fmt.Println(strings.HasSuffix(s3, "0")) //判断后缀
// n < 0 ,用 new 替换所有匹配上的 old;
fmt.Println("n=-1: ", strings.Replace(s, old, new, n )) n=-1替换所有,n=0不替换,n=4 替换第4个old
str = strings.Replace(str, " ", "", -1) //去除空格
fmt.Println(strings.Count(s3,"0"))//出现的非重叠次数
fmt.Println(strings.Repeat(s3,2))//重复字符串
fmt.Println(strings.TrimSpace(s3))//修剪字符串 去掉开头和结尾空格
fmt.Println(strings.Trim(strings.TrimSpace(s3),"a"))//修剪字符串 去掉开头和结尾字符串
}
小结:
- 字符串是一个字节切片。字符串是一个常量,字符串值不可改变。
- 字符串能被循环获取到每个字节。能够进行拼接、指定位置获取。因为属于字符切片。所以切片的特性和操作都是允许的。(除了修改东西)。基本的操作使用strings包。
- 子字符串包含相关:是否包含、索引位置,最后索引位置。
- 大小写转换
- 拆分、去空格、替换字符串