1. Go 语言字符串底层实际上是 byte 数组,所以字符串中的每一个字符为 byte 类型,byte 其实是 uint8 的一个别名,字符串中的每一个字符可以看成是 0~225 之间的某一个整数,Go 语言字符串本身不支持直接修改,需要使用 byte() 函数将其转为 byte 数组:s1 := []byte(s) 才可以进行修改,修改完成之后可以使用 string() 函数将其转为字符串即可;字符串遍历有两种方式:第一种使用 for循环的下标遍历,也即普通的 for 循环遍历;第二种使用 for-range 来遍历,需要注意的是 for-range 遍历字符串的时候会得到每一个字符对应的下标以及对应字符的 int32 类型的整数表示,这其实与 go 语言 range 函数的内部机制有关,遍历字符串的时候会将原来字符串中 uint8 类型的字符转为 int32,所以这也是下标遍历与 for-range 遍历字符串的一个区别,并且字符加上一个整数的操作过程中会向下兼容,比如 c = 'a' 本质上是 int32 类型的数字(直接声明一个字符与字符串中的字符又有点区别,两者类型是不一样的),加上 byte(x),其中 x 为 int 类型的数字,结果为 byte 类型的数字,也即 res := 'a' + byte(x),res 的类型为 byte:
package main
import "fmt"
func main() {
s := "abc"
// 将s转为byte数组才可以进行修改
s1 := []byte(s)
c := s[0] - 'a'
// %T输出对应的类型, %v输出变量对应的值
fmt.Printf("%T %T %T %T %v %v\n", c, s[0], 'a', 'a'+byte(8), s[0], s1)
// 遍历字符串有两种方式: 1. 索引遍历 2. for-range遍历
// _表示忽略遍历s的时候得到的下标, v表示当前索引对应字符的int32整数表示
for _, v := range s {
fmt.Printf("%T %T %T %T\n", v-'a', v, 'a', 'a'+byte(8))
}
// 索引遍历
for i := 0; i < len(s); i++ {
fmt.Printf("%T \n", s[i])
}
}
2. 将字符串转为一个整数,有的时候需要将字符串转为 int 类型的数字,除了调用 strconv 包中的相关函数之外,其实我们还可以使用字符串底层为 uint8 类型整数的这个特点通过 int,int64 或者其他函数将其转为整数,通过遍历整数类型的字符串可以发现得到的是对应字符的 ascii 值,将 ascii 值与 15 进行与运算就可以得到当前位对应的整数值,最终就可以得到字符串 s 对应的整数值:
package main
import "fmt"
func main() {
// 在声明字符串s的时候使用":="快速初始化s
s := "0123456789"
// 使用索引遍历字符串
for i := 0; i < len(s); i++ {
// 使用Printf格式化输出
fmt.Printf("%v ", s[i])
}
fmt.Println()
s1 := "392932"
n := 0
// 将s1转位int类型整数
for i := 0; i < len(s1); i++ {
n = n*10 + int(s1[i]&15)
}
fmt.Printf("%v", n)
}
3. 字符串的常用操作,主要是分隔字符串,判断是否存在某个子串,是否存在某个前缀或者某个后缀,找到某个子串第一次出现的位置,拼接字符串等操作,可以使用 Sprintf 来拼接字符串等,主要是调用 strings 包下的函数:
package main
import (
"fmt"
"strings"
)
func main() {
// 1. len(str)获取字符串的长度
s := "Hello World!"
fmt.Println(len(s))
// 2. strings.Split()按照分隔符切分字符串, 函数的返回值是按照分隔符切分之后的字符串切片
s1 := "I am a student"
s2 := strings.Split(s1, " ")
for i := 0; i < len(s2); i++ {
fmt.Print(s2[i], " ")
}
fmt.Println()
// 3. Contains()判断字符串中是否包含子串substr
fmt.Println(strings.Contains(s1, "am"))
// 4. HasPrefix(),HasSuffix()判断是否包含前缀与后缀
fmt.Println(strings.HasPrefix("abbbcas", "abb"))
fmt.Println(strings.HasSuffix("abbbcas", "cas"))
// 5. strings.Index()返回子串第一次出现的位置, 不存在返回-1
// strings.LastIndex()返回子串最后一次出现的位置, 不存在返回-1
s3 := "abbabbabbab"
fmt.Println(strings.Index(s3, "abb"))
fmt.Println(strings.LastIndex(s3, "abb"))
// 6. join()对string切片的元素添加分隔符的操作, 返回的是添加分隔符之后的字符串
s4 := []string{"I", "am", "a", "student"}
fmt.Println(s4)
fmt.Println(strings.Join(s4, " "))
}