这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
我们从浅到深分析一下Go的string
我们先从最简单的ASCII码开始。
1.ASCII文本
package main
import "fmt"
func main() {
var s = "abc"
//通过Println打印的是a的ASCII码
fmt.Println(s[0])
//通过Printf直接打印没法打印,通过类型转换可以直接输出a的字符
fmt.Printf(string(s[0]) + "\n")
//通过Printf打印%v输出的也是a的ASCII码
fmt.Printf("%v\n", s[0])
//通过Printf打印%c输出的是a的字符值
fmt.Printf("%c\n", s[0])
//通过range 循环遍历可以直接输出a的字符值
for c := range s {
fmt.Printf("%v ", c)
}
}
输出内容
ASCii文本访问基本没有什么问题,哪怕是我们直接获取的是ASCII码,我们也可以进行字符预算或者进行字符判断或者大小写判断。
2.中文文本
package main
import "fmt"
func main() {
var s = "测试段"
//打印的是大于128的值
fmt.Println(s[0])
//输出乱码
fmt.Printf(string(s[0]) + "\n")
//打印的是大于128的值
fmt.Printf("%v\n", s[0])
//输出乱码
fmt.Printf("%c\n", s[0])
//输出的是字符的索引
for c := range s {
fmt.Printf("%v ", c)
}
fmt.Println()
//输出三个字符的Unicode的十进制编码
for _, c := range s {
fmt.Printf("%v ", c)
}
fmt.Println()
//遍历可以正确获取中文字符
for _, c := range s {
fmt.Printf("%c ", c)
}
//根据上面的内容,range遍历可以直接获取到中文字符的unicode编码
}
输出结果
为什么会出现上面这种结果呢?主要的原因是Go是通过utf-8来储存字符,在utf-8中,中文的存储是3个字节,而数字以及字母都是一个字节,也就是8位。所以我们要把中文字符串转成int32才能正确的表示。
package main
import "fmt"
func main() {
var s = "测试段"
copyStr := []int32(s)
//打印的时'测'的Unicode编码10进制
//下面是我查的'测'的unicode码
//字符 编码10进制 编码16进制 Unicode编码10进制 Unicode编码16进制
//测 15119755 E6B58B 27979 6D4B
fmt.Println(copyStr[0])
//输出字符'测'
fmt.Printf(string(copyStr[0]) + "\n")
//输出'测'的Unicode编码十进制
fmt.Printf("%v\n", copyStr[0])
//输出字符'测'
fmt.Printf("%c\n", copyStr[0])
//输出有问题
for c := range copyStr {
fmt.Printf("%v ", c)
}
fmt.Println()
for _, c := range copyStr {
fmt.Printf("%v ", c)
}
fmt.Println()
for _, c := range copyStr {
fmt.Printf("%c ", c)
}
}
输出结果
3.stirng的API
除此之外,我们可以看一下这个string的相关API,除了切片之外,我们可以用到的API。
| 函数名 | 功能 | 返回值 | 返回值分析 |
|---|---|---|---|
| func Compare(a, b string) int | 比较字符 | -1,0,1 | a<b 返回1,a=b 返回0,a>b 返回 1 |
| func Contains(s, substr string) bool | s中是否包含substr | true/false | 包含则返回true,不包含返回false |
| func ContainsRune(s string, r rune) bool | s中是否包含r这个码点(unicode下的十进制编码) | true/false | 包含则返回true,不包含返回false |
| func ContainsAny(s, chars string) bool | s中是否包含chars任意一个字符 | true/false | 如果包含任意一个字符返回true,一个都不包含则返回false |
| func Count(s, substr string) int | 计算s中包含多少个substr | int | 最少0个 |
Package strings - The Go Programming Language (google.cn)这个网址是stringAPI网址,内容虽然是英文的,但是自带了IDE能够在线运行代码,而且给出了示例代码,真的很不错!!