作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.字符串定义
1.字符串概述
字符串就是一串固定长度的字符链接起来的字符序列,字符和字符串的关系有点类似于糖葫芦,羊肉串,豌豆荚之类的关系。
Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64等)一样。
Go语言里的字符串的内部实现使用UTF-8编码,该字符集包含包含ASCII码。 字符串的值为双引号(")中的内容。
2.多行字符串
package main
import (
"fmt"
)
func main() {
var (
// 1.单行模式(Single row mode),使用双引号("")括起来即可
s1 string = "\n\tGOPATH路径:\n\t\t 'd:\\yinzhengjie\\code\\Golang\\go.exe'\n\t\t\t\v开始学习Golang吧!\v要加油哟!\v你可以的!"
// 2.多行字符串模式(Multiline mode),使用反引号(``)包起来即可,这是Go语言特有的写法。
// 反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
s2 string = `
欢迎访问博客地址:
"https://www.cnblogs.com/yinzhengjie/"
\n\t\t\t\v开始学习Golang吧!
`
s3 = "yinzhengjie"
)
fmt.Printf("s1 ---> %s\n", s1)
fmt.Printf("s2 ---> %s\n", s2)
// 3.字符串不支持修改,会报错: cannot assign to s3[0] (neither addressable nor a map index expression)
// s3[0] = 'Y'
fmt.Println(s3[0])
}
3.修改字符串
package main
import (
"fmt"
)
func main() {
s1 := "白萝卜"
// 想要修改字符串,则需要将字符串转换为切片类型进行修改。
s2 := []rune(s1)
fmt.Println("修改前 --->: ", string(s2))
s2[0] = '红'
fmt.Println("修改后 --->: ", string(s2))
// 实际上,s1这个变量压根就没有动过
fmt.Println("s1 = ", s1)
}
二 字符串常用的操作
1 查看字符串的长度
package main
import (
"fmt"
)
func main() {
// 统计字符串的长度默认是按照字节进行统计,而golang中,汉字是utf-8字符集,一个汉字对应3个字节。
s1 := "尹正杰Golang"
// len为内置函数,无需导包,直接使用即可
fmt.Printf("s1的字符串长度为: %d\n", len(s1))
}
2 遍历字符串
package main
import (
"fmt"
)
func main() {
s1 := "尹正杰2020"
// 遍历字符串方式一: 利用for-range循环
for index, value := range s1 {
fmt.Printf("索引为: %d, 数据为: %c\n", index, value)
}
fmt.Println("---------- 分割线 ----------")
// 遍历字符串方式二: 字节切片"[]rune(string)"
data := []rune(s1)
for index := 0; index < len(data); index++ {
fmt.Printf("索引为: %d, 数据为: %c\n", index, data[index])
}
}
3 字符串和整数相互转换
package main
import (
"fmt"
"strconv"
)
func main() {
var (
a string = "2030"
b int = 2020
)
// 将字符串转换为一个整数
x, _ := strconv.Atoi(a)
fmt.Printf("x的类型是: %T, x的值为: %d\n", x, x)
// 整数转换为字符串
y := strconv.Itoa(b)
fmt.Printf("y的类型是: %T, y的值为: %s\n", y, y)
}
4 统计一个字符串有几个指定的子串
package main
import (
"fmt"
"strings"
)
func main() {
source := "Google FaceBook"
subStr := "oo"
// 统计一个字符串有几个指定的子串
count := strings.Count(source, subStr)
fmt.Printf("[%s]中出现[%s]的次数是: %d\n", source, subStr, count)
}
5 字符串比较
package main
import (
"fmt"
"strings"
)
func main() {
password := "HELLO"
input := "hello"
// 忽略大小写的字符串比较
flag := strings.EqualFold(password, input)
// 区分大小写比较
flag2 := password == input
fmt.Printf("忽略大小写比较: %s = %s ---> [%t]\n", password, input, flag)
fmt.Printf("区分大小写比较: %s == %s ---> [%t]\n", password, input, flag2)
}
6 求子串出现的位置
package main
import (
"fmt"
"strings"
)
func main() {
src := "JasonYin2020 no problem !!!"
findstr := "o"
// 求子串第一次出现的位置,如果没有返回-1
first := strings.Index(src, findstr)
// 求子串最后次出现的位置,如果没有返回-1
last := strings.LastIndex(src, findstr)
fmt.Printf("[%s]字符串的[%s]第一次出现的位置是: %d\n", src, findstr, first)
fmt.Printf("[%s]字符串的[%s]最后一次出现的位置是: %d\n", src, findstr, last)
}
7 字符串的替换
package main
import (
"fmt"
"strings"
)
func main() {
source := "go ! go ! fire the hole ~ go ! go ! fire the hole ~"
src := "go"
dest := "golang"
// 字符串的替换,"-1"表示全部替换。
s1 := strings.Replace(source, src, dest, -1)
// 字符串的替换,"2"表示只替换2次,如果想要指定替换次数修改成相应的数字即可。
s2 := strings.Replace(source, src, dest, 2)
fmt.Printf("s1 = %s\n", s1)
fmt.Printf("s2 = %s\n", s2)
}
8 切割字符串
package main
import (
"fmt"
"strings"
)
func main() {
s1 := "DAU|5200|添加购物车|1|3270221.99"
// 将s1字符串按照字符"b"进行切割,将字符串拆分成字符串切片
s2 := strings.Split(s1, "|")
fmt.Printf("s2 = %v\n",s2)
fmt.Printf("userId = %v, svip= %v\n",s2[1],s2[3])
}
9 字母大小写转换
package main
import (
"fmt"
"strings"
)
func main() {
src := "Golang"
lower := strings.ToLower(src)
upper := strings.ToUpper(src)
fmt.Printf("%s转换为小写后: %s\n", src, lower)
fmt.Printf("%s转换为大写后: %s\n", src, upper)
}
10 剔除字符
package main
import (
"fmt"
"strings"
)
func main() {
s1 := " Golang xixi "
// 将字符串左右两边的空格去掉
s2 := strings.TrimSpace(s1)
fmt.Printf("s1 = [%s],s2 = [%s]\n", s1, s2)
s3 := "@@@golang@@@"
// 将字符左边指定的字符去掉
s4 := strings.TrimLeft(s3,"@")
// 将字符右边指定的字符去掉
s5 := strings.TrimRight(s3,"@")
fmt.Printf("s3 = [%s],s4 = [%s],s5 = [%s]\n", s3,s4,s5)
}
11 判断前缀和后缀
package main
import (
"fmt"
"strings"
)
func main() {
s1 := "https://www.cnblogs.com/yinzhengjie"
prefix := "https"
// 判断字符串是否以'https'开头
result01 := strings.HasPrefix(s1, prefix)
suffix := "yinzhengjie"
// 判断字符串是否以'yinzhengjie'结尾
result02 := strings.HasSuffix(s1, suffix)
fmt.Printf("[%s]以[%s]开头,---> [%t]\n", s1, prefix, result01)
fmt.Printf("[%s]以[%s]结尾,---> [%t]\n", s1, suffix, result02)
}
12 拼接字符串
package main
import (
"fmt"
)
func main() {
s1 := "Jason Yin"
s2 := "https://www.cnblogs.com/yinzhengjie/"
// 方式一: 直接使用"+"进行拼接字符串
s3 := s1 + "的博客地址:" + s2
fmt.Printf("s3 ---> %s\n", s3)
// 方式二: 使用"fmt"包的"Sprintf"方法也可以用于拼接字符串哟~
s4 := fmt.Sprintf("%s的博客地址:%s", s1, s2)
fmt.Printf("s4 ---> %s\n", s4)
}
13 判断是否包含子串
package main
import (
"fmt"
"strings"
)
func main() {
s1 := "JasonYin2020"
subStr := "Yin"
// 判断s1字符串是否包含字符串"Yin",区分大小写哟~
result := strings.Contains(s1, subStr)
fmt.Printf("[%s]包含[%s] ---> %t\n", s1, subStr, result)
}
14 字符串join操作
package main
import (
"fmt"
"strings"
)
func main() {
// 定义一个切片
s1 := []string{"C++", "Java", "Golang", "Python", "JavaScript", "CSS"}
// 将一个切片拼接为一个字符串
s2 := strings.Join(s1, "######")
fmt.Printf("s2的类型是: %T, s2的数据为: %s\n", s2, s2)
}
15 查看官方文档
方法一: 基于命令行的方式查看:
go doc strings.Split // 表示查看"strings"包的"Split"方法的文档。
详细命令请参考: (go help doc)
go doc [doc flags] [package|[package.]symbol[.methodOrField]]
方法二: 基于官方文档查看:
https://studygolang.com/pkgdoc
https://pkg.go.dev/std
方法三: 基于本地文档查看(早期版本是默认会安装一个godoc命令,新版本安装貌似没找到哟~可能是集成到go)
godoc -http:=9000
推荐阅读:
https://developer.aliyun.com/article/1604746