目录
1.基本概念
2.string常用方法
(1).len()
(2).追加 +=
(3).string取值 [ ]
(4).string拼接(5种)
(5).string分割 Split
(6).string与整数之间转换
3.string重要方法
(1).字符串比较(两种)
(2).去除 TrimSpace
(3).索引位置 Index
(4).统计子字符串个数 Count
4.string基本方法
(1).判断包含 Contains
(2).判断前后缀
(3).替换 Replace
(4).连续复制 Repeat
5.golang转义子符
6.字符串赋值(拷贝),地址变化情况
1.golang的字符类型(byte和rune)
(1).byte类型:也称uint8类型(0 ~ 255),每个数代表了ASCII码的一个字符。
(2).rune类型:代表一个 UTF-8 字符,英文字母1个字节,汉字3个字节
2.关键字string,使用方式:用双引号"",或反引号``
3.string是不可变,不能通过索引下标的方式修改字符串中的数据
4.go语言中的字符串是以原生数据类型出现,字符串的内部实现的编码是UTF-8,英文字母1个字节,汉字3个字节,生僻字4-6个字节
1.长度len():
特别注意:len():是求字节长度,在golang中,一个中文字符占三个字节长度
package main
import "fmt"
func main() {
mag := "我们在学golang"
fmt.Printf("mag长度: %v\n", len(mag)) // mag字节长度: 18
fmt.Println(utf8.RuneCountInString(mag)) // 补充打印mag字符串长度(中文也算1长度)
}
2.字符串追加(数字类型追加也可用):+=
3.string[]取值:
分类:str[n], str[:], str[:n], str[n:], str[n:m] 其中n与m是字节位置,从0开始。[]取值是取头不取尾
(1).str[n]取值:返回的是第n字节位置上字符对应的Unicode码值(uint8类型)
package main
import "fmt"
func main() {
mag := "我们在学golang"
fmt.Printf("mag[0]: %v\n", mag[0]) // mag[0]: 230 (注意取第一个中文不可用mag[0:2],会乱码)
fmt.Printf("mag[12]: %v\n", mag[12]) // mag[12]: 103 (默认打印Unicode(utf-8)码值)
fmt.Printf("mag[12]转译: %c\n", mag[12]) // mag[12]转译: g (用%c转义)
}
(2).str[:]取值:将str从头到尾克隆
(3).str[:n]取值:将str取0到n-1的值
(4).str[n:]取值:将str从n开始取值到最后
(5).str[n:m]取值:将str从n开始取值到m-1位
(6).取字符串中的中文字符:
原因:中文一个字不只是由一个字节组成,
直接通过切片获取时可能会把一个中文字的编码截成两半,结果导致最后一个字符是乱码。
解决办法:先将字符串转为[]rune类型,再截取后,转回字符串类型。
package main
import "fmt"
func main() {
mag := "我们在学golang"
nameRune := []rune(mag)
fmt.Println("第一个字符:", string(nameRune[0])) // 第一个字符:我
}
4.字符串拼接:
(1).加号+
a, b := "abc", "def"
mag := a + b
fmt.Printf("mag: %v\n", mag) // mag: abcdef
(2).字符串后面追加+=
a += b
(2).格式拼接
a, b := "abc", "def"
mag := fmt.Sprintf("%s%s", a, b)
fmt.Printf("mag: %v\n", mag) // mag: abcdef
(3).字符串型数组 strings.Join(mag []string, sep string)
mag := []string{"my", "name", "fly"}
fmt.Println(strings.Join(mag, "-")) // my-name-fly
// 补充:这面向的是全是字符串的数组(将数组内的字符串按格式拼接成字符串)
(4).字节缓存区 buffer.WriteString()
var buffer bytes.Buffer
buffer.WriteString("my")
buffer.WriteString("name")
buffer.WriteString("isfly")
fmt.Println(buffer.String() // mynameisfly
5.分割 Split (返回一个字符串数组)
(1)strings.Split(mag,sep string): 以sep方式对字符串mag进行 去除式 分割,返回一个字符串数组
mag := "我:叫:fly"
fmt.Println(strings.Split(mag, ":")) // [我 叫 fly] 类型:[]string
(2).strings.Title(mag):
描述:将字符串mag出现的连续空白字符转为一个空白字符(按照空白字符进行去除式分割),
返回一个字符串数组(返回str空格分隔的所有子串的slice)
mag := "dvf sg fdg"
fmt.Println(strings.Fields(mag)) // [dvf sg fdg]
(3).strings.SplitN(mag, sep string, n int):
描述:按照返回子字符串个数,对字符串mag以以sep方式进行 去除式 分割,返回一个字符串数组
mag := "dfsrdsfgdfdsffdvf"
fmt.Println(strings.SplitN(mag, "d", -2)) // [ fsr sfg f sff vf] n<0 全切
fmt.Println(strings.SplitN(mag, "d", -1)) // [ fsr sfg f sff vf]
fmt.Println(strings.SplitN(mag, "d", 0)) // [] n=0 返回[]
fmt.Println(strings.SplitN(mag, "d", 1)) // [dfsrdsfgdfdsffdvf] n>0 返回n个子字符串(切除n-1个sep字符)
fmt.Println(strings.SplitN(mag, "d", 2)) // [ fsrdsfgdfdsffdvf]
fmt.Println(strings.SplitN(mag, "d", 3)) // [ fsr sfgdfdsffdvf]
fmt.Println(strings.SplitN(mag, "d", 4)) // [ fsr sfg fdsffdvf]
fmt.Println(strings.SplitN(mag, "d", 5)) // [ fsr sfg f sffdvf]
fmt.Println(strings.SplitN(mag, "d", 6)) // [ fsr sfg f sff vf]
fmt.Println(strings.SplitN(mag, "d", 7)) // [ fsr sfg f sff vf] n大于Count(sep)+1,全切
(4).strings.SplitAfter(mag, sep string):
描述:以sep字符后面开始,对字符串mag进行 非去除式 分割,返回一个字符串数组
mag := "vvdfsrdsfgdfdsffdvf"
fmt.Println(strings.SplitAfter(mag, "d")) // [vvd fsrd sfgd fd sffd vf]
(5).strings.SplitAfterN(mag, sep string, n int):
描述:按照返回子字符串个数,以sep字符后面开始,对字符串mag进行 非去除式 分割,返回一个字符串数组
6.string与整数之间转换
(1).整数i转成字符串 strconv.Itoa(i int)
mag := 12
fmt.Println(strconv.Itoa(mag), reflect.TypeOf(strconv.Itoa(mag))) // 12 string
//补充:打印类型可以用模块“reflect”, reflect.TypeOf()
(2).字符串转整数 strconv.Atoi(mag string) 返回(int, error)
mag := "12"
n, err := strconv.Atoi("123")
if err!=nil {
panic(err)
}
fmt.println(n, reflect.TypeOf(n)) // 12 int
1.字符串比较(两种):
(1).strings.Compare(a, b string) // 如果a==b返回0;如果a
1.判断包含 Contains :
mag := "我们在学golang"
fmt.Println(strings.Contains(mag, "我")) // true 判断字符串mag是否包含子字符串"我"
fmt.Println(strings.ContainsRune(mag, 103)) // true 判断字符串mag是否包含utf-8码值103(103是g)
fmt.Println(strings.ContainsAny(mag, mag)) // true 判断字符串mag是否包含字符串mag中的任一字符
2.判断前后缀
(1).判断前缀 strings.HasPrefix()
mag := "我:是:fly"
fmt.Println(strings.HasPrefix(mag, "我:")) // true
(2).判断后缀 strings.HasSuffix
mag := "你:好:呀"
fmt.Println(strings.HasSuffix(mag, "啊")) // flase
3.替换 Replace
mag := "我们在学golang"
fmt.Println(strings.Replace(mag, "g", "n", 2)) // 我们在学nolann
// 参数 "g":被替换字符串(old),"n":新字符串(new),2:前面2个“g”(个数)
4.连续复制 Repeat
mag := "我们在学golang"
fmt.Println(strings.Repeat(mag, 3)) // 我们在学golang我们在学golang我们在学golang 复制3次
1. \r 回车(回到首行)
2. \n 换行符(直加跳到下一行的同列位置)
3. \t 制表符(占位)
4. \' 单引号
5. \" 双引号
6. \\ 反斜杆
1.golang的字符串赋值,并不是直接拷贝底层的值(不是拷贝底层字符串数组)
而是拷贝了一个指针和长度字段指向该值
a := "abc"
a = "def"
b := a
c := "ghi"
a = b + c
fmt.Printf("ft: %v\n", a) // defghi
fmt.Printf("sd: %v\n", b) // def
fmt.Printf("gh: %v\n", c) // ghi
2.对已有值得字符串重新赋值,原内存空间不变,
申请新的内存空间进行赋值指针指向新值地址