字符串的遍历
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "天气好干燥啊A"
fmt.Println("字节长度", len(s))
fmt.Println("================")
// for range 遍历字符串
len := 0
for i, ch := range s {
fmt.Printf("%d:%c ", i, ch)
len++
}
// 遍历所有字节
for i, ch := range []byte(s) {
fmt.Printf("%d:%x ", i, ch)
}
fmt.Println()
fmt.Println("================")
// 遍历所有字符
count := 0
for i, ch := range []rune(s) {
fmt.Printf("%d:%c ", i, ch)
count++
}
fmt.Println()
fmt.Println("字符串长度", len)
fmt.Println("字符长度", count)
fmt.Println("字符长度", utf8.RuneCountInString(s))
}
结果
字节长度 19
================
0:天 3:气 6:好 9:干 12:燥 15:啊 18:A 0:e5 1:a4 2:a9 3:e6 4:b0 5:94 6:e5 7:a5 8:bd 9:e5 10:b9 11:b2 12:e7 13:87 14:a5 15:e5 16:95 17:8a 18:41
================
0:天 1:气 2:好 3:干 4:燥 5:啊 6:A
字符串长度 7
字符长度 7
字符长度 7
遍历字符推荐使用rune,因为一个byte存不下一个汉字的unicode值。
字符串处理函数
检索字符串
方法
功能描述
func Contains(s, substr string) bool
判断字符串 s 是否包含 substr 字符串
func ContainsAny(s, chars string) bool
判断字符串 s 是否包含 chars 字符串中的任一字符
func ContainsRune(s string, r rune) bool
判断字符串 s 是否包含 unicode 码值 r
func Count(s, sep string) int
返回字符串 s 包含字符串 sep 的个数
func HasPrefix(s, prefix string) bool
判断字符串 s 是否有前缀字符串 prefix
func HasSuffix(s, suffix string) bool
判断字符串 s 是否有后缀字符串 suffix
func Index(s, sep string) int
返回字符串 s 中字符串 sep 首次出现的位置
func IndexAny(s, chars string) int
返回字符串 chars 中的任意一个 unicode 码值在 s 中首次出现的位置
func IndexByte(s string, c byte) int
返回字符串 s 中字符 c 首次出现的位置
func IndexFunc(s string, f func(rune) bool) int
返回字符串 s 中满足函数 f (r)=true 字符首次出现的位置
func IndexRune(s string, r rune) int
返回 unicode 码值 r 在字符串中首次出现的位置
func LastIndex(s, sep string) int
返回字符串 s 中字符串 sep 最后一次出现的位置
func LastIndexAny(s, chars string) int
返回字符串 chars 中的任意一个 unicode 码值在 s 中最后一次出现的位置
func LastIndexByte(s string, c byte) int
返回字符串 s 中字符 c 最后一次出现的位置
func LastIndexFunc(s string, f func(rune) bool) int
返回字符串 s 中满足函数 f (r)=true 字符最后一次出现的位置
package main
import (
"fmt"
"strings"
)
func main() {
TestContains()
}
func TestContains() {
fmt.Println(strings.Contains("hello", "i"))
fmt.Println(strings.Contains("hello", "o"))
fmt.Println(strings.Contains("hello", "o & e"))
fmt.Println(strings.Contains("hello", ""))
fmt.Println(strings.Contains("", ""))
}
package main
import (
"fmt"
"strings"
)
func main() {
TestContainsAny()
}
func TestContainsAny() {
fmt.Println(strings.ContainsAny("hello", "i"))
fmt.Println(strings.ContainsAny("hello", "o"))
fmt.Println(strings.ContainsAny("hello", "o & e"))
fmt.Println(strings.ContainsAny("hello", ""))
fmt.Println(strings.ContainsAny("", ""))
}
package main
import (
"fmt"
"strings"
)
func main() {
TestContainsRune()
}
func TestContainsRune() {
fmt.Println(strings.ContainsRune("一丁", '丁'))
fmt.Println(strings.ContainsRune("一丁", 19969))
}
package main
import (
"fmt"
"strings"
)
func main() {
TestCount()
}
func TestCount() {
fmt.Println(strings.Count("一丁", "丁"))
fmt.Println(strings.Count("一丁", "000"))
fmt.Println(strings.Count("one", "")) // 结果是4
fmt.Println(strings.Count("one", "e"))
}
package main
import (
"fmt"
"strings"
)
func main() {
TestHasPrefix()
}
func TestHasPrefix() {
fmt.Println(strings.HasPrefix("100000 phone news", "1000"))
fmt.Println(strings.HasPrefix("100000 phone news", "1000a"))
}
package main
import (
"fmt"
"strings"
)
func main() {
TestHasSuffix()
}
func TestHasSuffix() {
fmt.Println(strings.HasSuffix("100000 phone news", "news"))
fmt.Println(strings.HasSuffix("100000 phone news", "SSS0a"))
}
package main
import (
"fmt"
"strings"
)
func main() {
TestIndex()
}
func TestIndex() {
fmt.Println(strings.Index("chicken", "ken"))
fmt.Println(strings.Index("chicken", "dne"))
}
// 没有则返回-1
// 返回字符串中满足函数f(c)==true字符最后一次出现的位置
package main
import (
"fmt"
"strings"
"unicode"
)
func main() {
TestLastIndexFunc()
}
func TestLastIndexFunc() {
f := func(c rune) bool {
return unicode.Is(unicode.Han, c)
}
fmt.Println(strings.LastIndexFunc("hello,世界", f))
fmt.Println(strings.LastIndexFunc("hello,四季青", f))
}
分割字符串
方法
功能描述
func Fields(s string) []string
将字符串 s 以空白字符分割,返回一个切片
func FieldsFunc(s string, f func(rune) bool) []string
将字符串 s 以满足 f (r)==true 的字符分割,返回一个切片
func Split(s, sep string) []string
将字符串 s 以 sep 作为分隔符进行分割,分割后字符最后去掉 sep
func SplitAfter(s, sep string) []string
将字符串 s 以 sep 作为分隔符进行分割,分割后字符最后附上 sep
func SplitAfterN(s, sep string, n int) []string
将字符串 s 以 sep 作为分隔符进行分割,分割后字符最后附上 sep,n 决定返回的切片数
func SplitN(s, sep string, n int) []string
将字符串 s 以 sep 作为分隔符进行分割,分割后字符最后去掉 sep,n 决定返回的切片数
package main
import (
"fmt"
"strings"
)
func main() {
TestFields()
}
func TestFields() {
fmt.Println(strings.Fields(" abc 123 "))
}
大小写转换
方法
功能描述
func Title(s string) string
将字符串 s 每个单词首字母大写返回
func ToLower(s string) string
将字符串 s 转换成小写返回
func ToLowerSpecial(_case unicode.SpecialCase, s string) string
将字符串 s 中所有字符按_case 指定的映射转换成小写返回
func ToTitle(s string) string
将字符串 s 转换成大写返回
func ToTitleSpecial(_case unicode.SpecialCase, s string) string
将字符串 s 中所有字符按_case 指定的映射转换成大写返回
func ToUpper(s string) string
将字符串 s 转换成大写返回
func ToUpperSpecial(_case unicode.SpecialCase, s string) string
将字符串 s 中所有字符按_case 指定的映射转换成大写返回
修剪字符串
方法
功能描述
func Trim(s string, cutset string) string
将字符串 s 首尾包含在 cutset 中的任一字符去掉返回
func TrimFunc(s string, f func(rune) bool) string
将字符串 s 首尾满足函数 f (r)==true 的字符去掉返回
func TrimLeft(s string, cutset string) string
将字符串 s 左边包含在 cutset 中的任一字符去掉返回
func TrimLeftFunc(s string, f func(rune) bool) string
将字符串 s 左边满足函数 f (r)==true 的字符去掉返回
func TrimPrefix(s, prefix string) string
将字符串 s 中前缀字符串 prefix 去掉返回
func TrimRight(s string, cutset string) string
将字符串 s 右边包含在 cutset 中的任一字符去掉返回
func TrimRightFunc(s string, f func(rune) bool) string
将字符串 s 右边满足函数 f (r)==true 的字符去掉返回
func TrimSpace(s string) string
将字符串 s 首尾空白去掉返回
func TrimSuffix(s, suffix string) string
将字符串 s 中后缀字符串 suffix 去掉返回
比较字符串
方法
功能描述
func Compare(a, b string) int
按字典顺序比较 a 和 b 字符串大小
func EqualFold(s, t string) bool
判断 s 和 t 两个 UTF - 8 字符串是否相等,忽略大小写
func Repeat(s string, count int) string
将字符串 s 重复 count 次返回
func Replace(s, old, new string, n int) string
替换字符串 s 中 old 字符为 new 字符并返回,n<0 时替换所有 old 字符串
func Join(a []string, sep string) string
将 a 中的所有字符连接成一个字符串,使用字符串 sep 作为分隔符
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通