Go 字符串操作
Posted 看,未来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 字符串操作相关的知识,希望对你有一定的参考价值。
文章目录
简介
字符串是不可变值类型,内部用指针指向 UTF-8 字节数组。
- 默认值是空字符串 “”。
- 用索引号访问某字节,如 s[i]。
- 不能用序号获取字节元素指针,&s[i] 非法。
- 不可变类型,无法修改字节数组。
- 字节数组尾部不包含 NULL。
使用索引号访问字符 (byte)
package main
func main()
s := "abc"
println(s[0] == '\\x61', s[1] == 'b', s[2] == 0x63)
输出结果:
true true true
使用 “ ` “ 定义不做转义处理的原始字符串,支持跨行
package main
func main()
s := `a
b\\r\\n\\x00
c`
println(s)
输出结果:
a
b\\r\\n\\x00
c
跨行拼接字符串
连接跨行字符串时,”+” 必须在上一行末尾,否则导致编译错误
package main
import (
"fmt"
)
func main()
s := "Hello, " +
"World!"
// s2 := "Hello, "
// +"World!"
//./main.go:11:2: invalid operation: + untyped string
fmt.Println(s)
输出结果:
Hello, World!
子串切片
串依然指向原字节数组,仅修改了指针和度属性。
package main
import (
"fmt"
)
func main()
s := "Hello, World!"
s1 := s[:5] // Hello
s2 := s[7:] // World!
s3 := s[1:5] // ello
fmt.Println(s, s1, s2, s3)
输出结果:
Hello, World! Hello World! ello
修改字符串
是说了不能直接修改,但是没说不能修改呀?!!
要修改字符串,可先将其转换成 []rune 或 []byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。
package main
func main()
s := "abcd"
bs := []byte(s)
bs[1] = 'B'
println(string(bs))
u := "电脑"
us := []rune(u)
us[1] = '话'
println(string(us))
输出结果:
aBcd
电话
遍历字符串
for 循环遍历字符串时,也有 byte 和 rune 两种方式
package main
import (
"fmt"
)
func main()
s := "abc汉字"
for i := 0; i < len(s); i++ // byte
fmt.Printf("%c,", s[i])
fmt.Println()
for _, r := range s // rune
fmt.Printf("%c,", r)
fmt.Println()
输出结果:
a,b,c,æ,±,‰,å,,—,
a,b,c,汉,字,
字符串替换
package main
import (
"fmt"
"strings"
)
func main()
str := "hello world world"
res0 := strings.Replace(str, "world", "golang", 2)
res1 := strings.Replace(str, "world", "golang", 1)
//trings.Replace("原字符串", "被替换的内容", "替换的内容", 替换次数)
fmt.Printf("res0 is %v\\n", res0)
fmt.Printf("res1 is %v\\n", res1)
输出结果:
res0 is hello golang golang
res1 is hello golang world
切割/合并 字符串
package main
import (
"strings"
"fmt"
)
func main()
// 按照指定字符串切割原字符串
// 用,切割字符串
arr1 := strings.Split("a,b,c", ",")
fmt.Println(arr1) // [a b c]
arr2 := strings.Split("ambmc", "m")
fmt.Println(arr2) // [a b c]
// 按照指定字符串切割原字符串, 并且指定切割为几份
// 如果最后一个参数为0, 那么会范围一个空数组
arr3 := strings.SplitN("a,b,c", ",", 2)
fmt.Println(arr3) // [a b,c]
arr4 := strings.SplitN("a,b,c", ",", 0)
fmt.Println(arr4) // []
// 按照指定字符串切割原字符串, 切割时包含指定字符串
arr5 := strings.SplitAfter("a,b,c", ",")
fmt.Println(arr5) // [a, b, c]
// 按照指定字符串切割原字符串, 切割时包含指定字符串, 并且指定切割为几份
arr6 := strings.SplitAfterN("a,b,c", ",", 2)
fmt.Println(arr6) // [a, b,c]
// 按照空格切割字符串, 多个空格会合并为一个空格处理
arr7 := strings.Fields("a b c d")
fmt.Println(arr7) // [a b c d]
// 将字符串转换成切片传递给函数之后由函数决定如何切割
// 类似于IndexFunc
arr8 := strings.FieldsFunc("a,b,c", custom)
fmt.Println(arr8) // [a b c]
// 将字符串切片按照指定连接符号转换为字符串
sce := []string"aa", "bb", "cc"
str1 := strings.Join(sce, "-")
fmt.Println(str1) // aa-bb-cc
// 返回count个s串联的指定字符串
str2 := strings.Repeat("abc", 2)
fmt.Println(str2) // abcabc
// 第一个参数: 需要替换的字符串
// 第二个参数: 旧字符串
// 第三个参数: 新字符串
// 第四个参数: 用新字符串 替换 多少个旧字符串
// 注意点: 传入-1代表只要有旧字符串就替换
// 注意点: 替换之后会生成新字符串, 原字符串不会受到影响
str3 := "abcdefabcdefabc"
str4 := strings.Replace(str3, "abc", "mmm", -1)
fmt.Println(str3) // abcdefabcdefabc
fmt.Println(str4) // mmmdefmmmdefmmm
func custom(r rune) bool
fmt.Printf("被调用了, 当前传入的是%c\\n", r)
if r == ','
return true
return false
以上是关于Go 字符串操作的主要内容,如果未能解决你的问题,请参考以下文章