掌握Golang strings包:高效字符串处理指南
掌握Golang strings包:高效字符串处理指南
- 引言
- 为什么要学习和掌握`strings`包
- 本教程的目标
- 基本用法
- `strings`包概述
- 导入`strings`包
- 常用函数列表及简要介绍
- 字符串创建与基本操作
- 创建字符串
- 字符串连接:`Join`
- 重复字符串:`Repeat`
- 修改字符串:`Replace`
- 字符串搜索
- 查找子字符串:`Contains`, `ContainsAny`, `ContainsRune`
- `Contains`
- `ContainsAny`
- `ContainsRune`
- 获取子字符串位置:`Index`, `LastIndex`, `IndexAny`, `LastIndexAny`, `IndexRune`
- `Index`
- `LastIndex`
- `IndexAny`
- `LastIndexAny`
- `IndexRune`
- 判断前缀和后缀:`HasPrefix`, `HasSuffix`
- `HasPrefix`
- `HasSuffix`
- 字符串分割与合并
- 分割字符串:`Split`, `SplitAfter`, `SplitN`, `SplitAfterN`
- `Split`
- `SplitAfter`
- `SplitN`
- `SplitAfterN`
- 合并字符串:`Join`
- 字符串大小写转换
- 全部转为小写:`ToLower`
- 全部转为大写:`ToUpper`
- 特殊转换:`ToTitle`
- 字符串修剪
- 去除空格及其他字符:`Trim`, `TrimSpace`, `TrimPrefix`, `TrimSuffix`
- `Trim`
- `TrimSpace`
- `TrimPrefix`
- `TrimSuffix`
- 去除指定字符:`TrimLeft`, `TrimRight`, `TrimFunc`
- `TrimLeft`
- `TrimRight`
- `TrimFunc`
- 字符串比较
- 比较两个字符串:`Compare`, `EqualFold`
- `Compare`
- `EqualFold`
- 高级用法
- 使用`Builder`优化字符串操作
- `Builder`的基本用法
- 字符串的读写:`Reader`, `NewReader`
- `NewReader`
- `Reader`的基本用法
- `ReadAt`
- 小结
- 性能优化
- 字符串操作性能分析
- 避免不必要的字符串复制
- 使用`Builder`和`Buffer`
- 性能分析工具
- 结论
- `strings`包的功能
引言
在Golang中,字符串处理是日常开发中必不可少的一部分。无论是处理用户输入、日志分析还是数据格式化,都离不开对字符串的操作。Golang提供了功能强大的strings
包,它包含了一系列用于字符串操作的函数,能够大大简化我们的开发工作。
Golang的strings
包不仅功能丰富,而且性能优越,适用于各种复杂的字符串处理任务。无论你是中级开发者还是高级开发者,掌握strings
包的用法和技巧,都是提升开发效率的重要一环。本教程将详细介绍strings
包的各种常用函数,并通过实战案例展示其在实际开发中的应用。
在接下来的章节中,我们将依次探讨如何使用strings
包创建、修改、搜索、分割、合并、转换、修剪和比较字符串,并深入探讨如何利用这些功能解决实际开发中的问题。通过学习这些内容,你将能够熟练掌握字符串处理的技巧,编写出更加高效和简洁的代码。
为什么要学习和掌握strings
包
- 功能强大:
strings
包提供了丰富的字符串操作函数,几乎涵盖了所有常见的字符串处理需求。 - 高效简洁:使用
strings
包可以使代码更加简洁,提升代码的可读性和维护性。 - 性能优越:Golang本身在性能方面表现优异,
strings
包在处理大规模字符串数据时也表现出色。 - 实用性强:无论是日常的小工具开发还是企业级应用,
strings
包都能派上用场。
本教程的目标
本教程的目标是通过详尽的解释和丰富的代码示例,让你全面了解Golang strings
包的各种功能及其应用场景,帮助你在实际开发中更加得心应手地处理字符串。接下来,我们将从strings
包的基本用法开始,逐步深入探讨各种高级技巧。
基本用法
strings
包概述
Golang的strings
包是标准库的一部分,专门用于处理和操作字符串。这个包提供了许多常用的函数,涵盖了从简单的字符串连接到复杂的字符串搜索和替换等各种操作。学习并掌握这些函数,可以让你在处理字符串时得心应手。
导入strings
包
要使用strings
包中的函数,首先需要在你的代码中导入这个包。导入的方法非常简单,只需要在代码的头部添加如下代码:
import "strings"
下面我们将逐一介绍strings
包中的常用函数,并通过具体的代码示例展示它们的用法。
常用函数列表及简要介绍
以下是strings
包中一些常用函数的列表及简要介绍:
Join
: 连接字符串切片,生成单一字符串。Repeat
: 重复一个字符串多次。Replace
: 在字符串中替换旧子字符串为新子字符串。Contains
: 判断字符串是否包含子字符串。Index
: 获取子字符串在字符串中的索引位置。HasPrefix
: 判断字符串是否以指定前缀开头。HasSuffix
: 判断字符串是否以指定后缀结尾。Split
: 分割字符串为切片。ToLower
: 将字符串转为小写。ToUpper
: 将字符串转为大写。Trim
: 修剪字符串两端的指定字符。Compare
: 比较两个字符串的大小。
在接下来的章节中,我们将详细介绍每个函数的用法和示例。
字符串创建与基本操作
创建字符串
在Golang中,字符串可以通过直接赋值来创建,例如:
str := "Hello, Golang!"
字符串也可以通过字符串字面量(包括反引号包裹的原始字符串字面量)来创建:
str1 := "Hello, Golang!"
str2 := `Hello, Golang!`
字符串连接:Join
Join
函数用于将字符串切片连接为一个字符串,并在每两个字符串之间插入指定的分隔符。其函数签名如下:
func Join(elems []string, sep string) string
示例:
package mainimport ("fmt""strings"
)func main() {parts := []string{"Hello", "World", "Golang"}result := strings.Join(parts, " ")fmt.Println(result) // 输出:Hello World Golang
}
重复字符串:Repeat
Repeat
函数用于重复一个字符串多次,并返回一个新的字符串。其函数签名如下:
func Repeat(s string, count int) string
示例:
package mainimport ("fmt""strings"
)func main() {str := "Go"result := strings.Repeat(str, 3)fmt.Println(result) // 输出:GoGoGo
}
修改字符串:Replace
Replace
函数用于在字符串中替换旧子字符串为新子字符串。其函数签名如下:
func Replace(s, old, new string, n int) string
参数n
指定替换的次数,如果为-1,则替换所有匹配的子字符串。
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, World! Hello, Golang!"result := strings.Replace(str, "Hello", "Hi", 1)fmt.Println(result) // 输出:Hi, World! Hello, Golang!result = strings.Replace(str, "Hello", "Hi", -1)fmt.Println(result) // 输出:Hi, World! Hi, Golang!
}
在上面的示例中,Replace
函数第一次只替换了第一个Hello
,第二次替换了所有的Hello
。
字符串搜索
在处理字符串时,查找和定位子字符串是非常常见的需求。strings
包提供了一系列函数用于执行这些操作。下面将详细介绍这些函数及其使用方法。
查找子字符串:Contains
, ContainsAny
, ContainsRune
Contains
Contains
函数用于判断字符串是否包含指定的子字符串。其函数签名如下:
func Contains(s, substr string) bool
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"fmt.Println(strings.Contains(str, "Golang")) // 输出:truefmt.Println(strings.Contains(str, "Python")) // 输出:false
}
ContainsAny
ContainsAny
函数用于判断字符串是否包含指定字符集中的任意字符。其函数签名如下:
func ContainsAny(s, chars string) bool
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"fmt.Println(strings.ContainsAny(str, "aeiou")) // 输出:truefmt.Println(strings.ContainsAny(str, "xyz")) // 输出:false
}
ContainsRune
ContainsRune
函数用于判断字符串是否包含指定的Unicode字符。其函数签名如下:
func ContainsRune(s string, r rune) bool
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"fmt.Println(strings.ContainsRune(str, 'G')) // 输出:truefmt.Println(strings.ContainsRune(str, 'P')) // 输出:false
}
获取子字符串位置:Index
, LastIndex
, IndexAny
, LastIndexAny
, IndexRune
Index
Index
函数用于获取子字符串在字符串中的索引位置,如果找不到子字符串则返回-1。其函数签名如下:
func Index(s, substr string) int
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"fmt.Println(strings.Index(str, "Golang")) // 输出:7fmt.Println(strings.Index(str, "Python")) // 输出:-1
}
LastIndex
LastIndex
函数用于获取子字符串在字符串中最后一次出现的索引位置,如果找不到子字符串则返回-1。其函数签名如下:
func LastIndex(s, substr string) int
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang! Hello, World!"fmt.Println(strings.LastIndex(str, "Hello")) // 输出:15fmt.Println(strings.LastIndex(str, "Python")) // 输出:-1
}
IndexAny
IndexAny
函数用于获取字符集中的任意字符在字符串中的第一个索引位置,如果找不到则返回-1。其函数签名如下:
func IndexAny(s, chars string) int
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"fmt.Println(strings.IndexAny(str, "aeiou")) // 输出:1fmt.Println(strings.IndexAny(str, "xyz")) // 输出:-1
}
LastIndexAny
LastIndexAny
函数用于获取字符集中的任意字符在字符串中最后一个索引位置,如果找不到则返回-1。其函数签名如下:
func LastIndexAny(s, chars string) int
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"fmt.Println(strings.LastIndexAny(str, "aeiou")) // 输出:10fmt.Println(strings.LastIndexAny(str, "xyz")) // 输出:-1
}
IndexRune
IndexRune
函数用于获取指定Unicode字符在字符串中的索引位置,如果找不到则返回-1。其函数签名如下:
func IndexRune(s string, r rune) int
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"fmt.Println(strings.IndexRune(str, 'G')) // 输出:7fmt.Println(strings.IndexRune(str, 'P')) // 输出:-1
}
判断前缀和后缀:HasPrefix
, HasSuffix
HasPrefix
HasPrefix
函数用于判断字符串是否以指定的前缀开头。其函数签名如下:
func HasPrefix(s, prefix string) bool
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"fmt.Println(strings.HasPrefix(str, "Hello")) // 输出:truefmt.Println(strings.HasPrefix(str, "Golang")) // 输出:false
}
HasSuffix
HasSuffix
函数用于判断字符串是否以指定的后缀结尾。其函数签名如下:
func HasSuffix(s, suffix string) bool
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"fmt.Println(strings.HasSuffix(str, "Golang!")) // 输出:truefmt.Println(strings.HasSuffix(str, "Hello")) // 输出:false
}
好的,我们继续编写“字符串分割与合并”章节的内容。
字符串分割与合并
在处理字符串时,分割和合并是常见的操作。Golang的strings
包提供了丰富的函数来实现这些操作。下面将详细介绍这些函数及其使用方法。
分割字符串:Split
, SplitAfter
, SplitN
, SplitAfterN
Split
Split
函数用于将字符串按照指定的分隔符分割成多个子字符串,并返回一个字符串切片。其函数签名如下:
func Split(s, sep string) []string
示例:
package mainimport ("fmt""strings"
)func main() {str := "a,b,c"result := strings.Split(str, ",")fmt.Println(result) // 输出:[a b c]
}
如果分隔符为空字符串,Split
函数会将字符串的每个字符拆分成单独的元素:
package mainimport ("fmt""strings"
)func main() {str := "abc"result := strings.Split(str, "")fmt.Println(result) // 输出:[a b c]
}
SplitAfter
SplitAfter
函数与Split
类似,但它在每个分隔符后面进行分割。其函数签名如下:
func SplitAfter(s, sep string) []string
示例:
package mainimport ("fmt""strings"
)func main() {str := "a,b,c"result := strings.SplitAfter(str, ",")fmt.Println(result) // 输出:[a, b, c]
}
SplitN
SplitN
函数用于将字符串按照指定的分隔符分割成最多n
个子字符串,并返回一个字符串切片。其函数签名如下:
func SplitN(s, sep string, n int) []string
示例:
package mainimport ("fmt""strings"
)func main() {str := "a,b,c,d"result := strings.SplitN(str, ",", 2)fmt.Println(result) // 输出:[a b,c,d]
}
SplitAfterN
SplitAfterN
函数与SplitN
类似,但它在每个分隔符后面进行分割。其函数签名如下:
func SplitAfterN(s, sep string, n int) []string
示例:
package mainimport ("fmt""strings"
)func main() {str := "a,b,c,d"result := strings.SplitAfterN(str, ",", 2)fmt.Println(result) // 输出:[a, b,c,d]
}
合并字符串:Join
Join
函数用于将字符串切片连接为一个字符串,并在每两个字符串之间插入指定的分隔符。其函数签名如下:
func Join(elems []string, sep string) string
示例:
package mainimport ("fmt""strings"
)func main() {parts := []string{"Hello", "World", "Golang"}result := strings.Join(parts, " ")fmt.Println(result) // 输出:Hello World Golang
}
在实际开发中,分割和合并字符串常常成对出现,例如处理CSV文件、解析用户输入等场景。通过合理使用Split
和Join
,可以高效地完成这些任务。
字符串大小写转换
在处理字符串时,经常需要进行大小写转换。Golang的strings
包提供了几个函数来实现这些操作,包括将字符串转换为小写、大写或标题形式。
全部转为小写:ToLower
ToLower
函数用于将字符串中的所有字符转换为小写。其函数签名如下:
func ToLower(s string) string
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"result := strings.ToLower(str)fmt.Println(result) // 输出:hello, golang!
}
全部转为大写:ToUpper
ToUpper
函数用于将字符串中的所有字符转换为大写。其函数签名如下:
func ToUpper(s string) string
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"result := strings.ToUpper(str)fmt.Println(result) // 输出:HELLO, GOLANG!
}
特殊转换:ToTitle
ToTitle
函数用于将字符串中的所有字符转换为标题格式,这通常意味着将每个单词的首字母转换为大写。其函数签名如下:
func ToTitle(s string) string
示例:
package mainimport ("fmt""strings"
)func main() {str := "hello, golang!"result := strings.ToTitle(str)fmt.Println(result) // 输出:HELLO, GOLANG!
}
注意:在大多数语言环境中,ToTitle
的效果与ToUpper
相同,但在某些语言环境中,ToTitle
可能会有不同的表现。
字符串修剪
字符串修剪操作是指去除字符串两端的空白或其他指定字符。Golang的strings
包提供了多种修剪函数,帮助我们实现这些操作。
去除空格及其他字符:Trim
, TrimSpace
, TrimPrefix
, TrimSuffix
Trim
Trim
函数用于去除字符串两端的指定字符。如果需要去除的字符不指定,则会默认去除空格。其函数签名如下:
func Trim(s string, cutset string) string
示例:
package mainimport ("fmt""strings"
)func main() {str := "!!!Hello, Golang!!!"result := strings.Trim(str, "!")fmt.Println(result) // 输出:Hello, Golang
}
TrimSpace
TrimSpace
函数用于去除字符串两端的空白字符,包括空格、换行符等。其函数签名如下:
func TrimSpace(s string) string
示例:
package mainimport ("fmt""strings"
)func main() {str := " Hello, Golang! "result := strings.TrimSpace(str)fmt.Println(result) // 输出:Hello, Golang!
}
TrimPrefix
TrimPrefix
函数用于去除字符串开头的指定前缀。如果字符串不以指定前缀开头,则返回原字符串。其函数签名如下:
func TrimPrefix(s, prefix string) string
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"result := strings.TrimPrefix(str, "Hello, ")fmt.Println(result) // 输出:Golang!
}
TrimSuffix
TrimSuffix
函数用于去除字符串结尾的指定后缀。如果字符串不以指定后缀结尾,则返回原字符串。其函数签名如下:
func TrimSuffix(s, suffix string) string
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, Golang!"result := strings.TrimSuffix(str, "Golang!")fmt.Println(result) // 输出:Hello,
}
去除指定字符:TrimLeft
, TrimRight
, TrimFunc
TrimLeft
TrimLeft
函数用于去除字符串左侧的指定字符。其函数签名如下:
func TrimLeft(s, cutset string) string
示例:
package mainimport ("fmt""strings"
)func main() {str := "!!!Hello, Golang!!!"result := strings.TrimLeft(str, "!")fmt.Println(result) // 输出:Hello, Golang!!!
}
TrimRight
TrimRight
函数用于去除字符串右侧的指定字符。其函数签名如下:
func TrimRight(s, cutset string) string
示例:
package mainimport ("fmt""strings"
)func main() {str := "!!!Hello, Golang!!!"result := strings.TrimRight(str, "!")fmt.Println(result) // 输出:!!!Hello, Golang
}
TrimFunc
TrimFunc
函数用于根据自定义的修剪函数来去除字符串两端的字符。其函数签名如下:
func TrimFunc(s string, f func(rune) bool) string
示例:
package mainimport ("fmt""strings""unicode"
)func main() {str := "123Hello, Golang123"result := strings.TrimFunc(str, func(r rune) bool {return unicode.IsDigit(r)})fmt.Println(result) // 输出:Hello, Golang
}
TrimFunc
函数非常灵活,可以根据自定义的条件来修剪字符串,非常适用于需要特殊处理的场景。
字符串比较
在字符串处理过程中,比较字符串是非常常见的操作。Golang的strings
包提供了一些函数用于比较字符串。下面将详细介绍这些函数及其使用方法。
比较两个字符串:Compare
, EqualFold
Compare
Compare
函数用于比较两个字符串的大小。其函数签名如下:
func Compare(a, b string) int
返回值:
- 0:表示两个字符串相等
- -1:表示字符串
a
小于字符串b
- 1:表示字符串
a
大于字符串b
示例:
package mainimport ("fmt""strings"
)func main() {fmt.Println(strings.Compare("a", "b")) // 输出:-1fmt.Println(strings.Compare("b", "a")) // 输出:1fmt.Println(strings.Compare("a", "a")) // 输出:0
}
EqualFold
EqualFold
函数用于比较两个字符串是否相等(忽略大小写)。其函数签名如下:
func EqualFold(s, t string) bool
示例:
package mainimport ("fmt""strings"
)func main() {fmt.Println(strings.EqualFold("Go", "go")) // 输出:truefmt.Println(strings.EqualFold("Go", "Go")) // 输出:truefmt.Println(strings.EqualFold("Go", "Golang")) // 输出:false
}
EqualFold
函数在需要忽略大小写进行比较时非常有用,比如用户输入的验证等场景。
高级用法
在Golang中,strings
包还提供了一些高级用法,可以进一步优化字符串操作的性能和灵活性。这些高级用法包括使用Builder
进行高效字符串拼接,以及使用Reader
进行字符串的读写操作。
使用Builder
优化字符串操作
在需要进行大量字符串拼接操作时,直接使用+
运算符可能会导致性能问题。Golang的strings
包提供了Builder
类型,可以高效地进行字符串拼接操作。Builder
通过减少内存分配次数,提高了拼接操作的性能。
Builder
的基本用法
Builder
提供了以下方法:
Write
: 将字节切片写入到Builder
WriteString
: 将字符串写入到Builder
String
: 返回拼接后的字符串Reset
: 重置Builder
示例:
package mainimport ("fmt""strings"
)func main() {var builder strings.Builderbuilder.WriteString("Hello, ")builder.WriteString("Golang")builder.Write([]byte("!"))result := builder.String()fmt.Println(result) // 输出:Hello, Golang!
}
使用Builder
可以显著提高字符串拼接操作的性能,尤其是在需要拼接大量字符串的场景下。
字符串的读写:Reader
, NewReader
Reader
类型用于从字符串中读取数据。它实现了io.Reader
接口,因此可以与Golang标准库中的许多函数一起使用。
NewReader
NewReader
函数用于创建一个Reader
。其函数签名如下:
func NewReader(s string) *Reader
Reader
的基本用法
示例:
package mainimport ("fmt""io""strings"
)func main() {reader := strings.NewReader("Hello, Golang!")buffer := make([]byte, 5)for {n, err := reader.Read(buffer)if err == io.EOF {break}fmt.Print(string(buffer[:n]))}// 输出:Hello, Golang!
}
在上述示例中,NewReader
创建了一个Reader
,然后使用Read
方法从字符串中读取数据。
ReadAt
ReadAt
方法用于从指定的位置开始读取数据。其函数签名如下:
func (r *Reader) ReadAt(p []byte, off int64) (n int, err error)
示例:
package mainimport ("fmt""strings"
)func main() {reader := strings.NewReader("Hello, Golang!")buffer := make([]byte, 5)reader.ReadAt(buffer, 7)fmt.Println(string(buffer)) // 输出:Golan
}
ReadAt
方法可以在不移动Reader
位置的情况下,从指定位置读取数据,非常适合需要随机访问字符串的场景。
小结
通过Builder
和Reader
,我们可以更加高效地进行字符串的拼接和读取操作。Builder
可以显著提高大量字符串拼接操作的性能,而Reader
提供了灵活的字符串读取方式。这些高级用法在实际开发中非常实用,能够帮助我们编写出性能更高、结构更清晰的代码。
性能优化
在实际开发中,性能优化是非常重要的一环。尤其是在处理大量字符串数据时,选择合适的方法和工具可以显著提高程序的性能。下面我们探讨一些字符串操作的性能优化技巧。
字符串操作性能分析
在进行字符串操作时,不同的方法可能会有不同的性能表现。常见的性能瓶颈包括频繁的内存分配和数据拷贝。在Golang中,字符串是不可变的,每次修改字符串都会生成一个新的字符串对象,这会导致频繁的内存分配和数据拷贝,从而影响性能。
避免不必要的字符串复制
在进行字符串拼接时,尽量避免使用+
运算符,因为每次使用+
都会创建一个新的字符串对象,导致频繁的内存分配和数据拷贝。可以使用strings.Builder
来高效地拼接字符串。
示例:
package mainimport ("fmt""strings""time"
)func main() {start := time.Now()var result stringfor i := 0; i < 10000; i++ {result += "a"}fmt.Println("Time taken with '+':", time.Since(start))start = time.Now()var builder strings.Builderfor i := 0; i < 10000; i++ {builder.WriteString("a")}result = builder.String()fmt.Println("Time taken with strings.Builder:", time.Since(start))
}
在这个示例中,我们对比了使用+
运算符和strings.Builder
进行字符串拼接的性能。可以看到,strings.Builder
的性能显著优于+
运算符。
使用Builder
和Buffer
前面已经介绍了strings.Builder
的使用,它通过减少内存分配次数,提高了字符串拼接操作的性能。对于需要频繁拼接字符串的场景,优先选择strings.Builder
。
此外,对于需要高效处理二进制数据的场景,可以使用bytes.Buffer
。bytes.Buffer
与strings.Builder
类似,但专门用于处理字节数据。
示例:
package mainimport ("bytes""fmt"
)func main() {var buffer bytes.Bufferbuffer.WriteString("Hello, ")buffer.WriteString("Golang!")result := buffer.String()fmt.Println(result) // 输出:Hello, Golang!
}
在这个示例中,我们使用bytes.Buffer
来拼接字符串。bytes.Buffer
提供了一系列高效的字节操作方法,非常适用于处理二进制数据。
性能分析工具
在进行性能优化时,使用性能分析工具可以帮助我们发现性能瓶颈,并进行针对性的优化。Golang提供了内置的性能分析工具pprof
,可以用来分析程序的CPU和内存使用情况。
示例:
package mainimport ("fmt""net/http"_ "net/http/pprof"
)func main() {go func() {fmt.Println(http.ListenAndServe("localhost:6060", nil))}()// Your code here
}
在这个示例中,我们启动了pprof
性能分析服务,可以通过浏览器访问http://localhost:6060/debug/pprof
来查看程序的性能分析报告。
结论
通过本教程的学习,我们详细介绍了Golang strings
包的各种功能及其在实际开发中的应用。我们从基本用法入手,逐步深入探讨了字符串的创建、修改、搜索、分割、合并、转换、修剪和比较等操作,并结合实际案例展示了这些操作在开发中的应用。
strings
包的功能
- 基本操作:创建、修改、连接和重复字符串。
- 搜索功能:查找子字符串、获取索引位置、判断前缀和后缀。
- 分割与合并:将字符串分割成切片、将切片合并为字符串。
- 大小写转换:将字符串转换为小写、大写和标题形式。
- 修剪功能:去除字符串两端的空白或指定字符。
- 字符串比较:比较字符串大小、忽略大小写比较。
- 高级用法:使用
Builder
进行高效字符串拼接,使用Reader
进行字符串读写。
希望本教程对你在Golang开发中的字符串处理有所帮助,提升你的开发效率和代码质量。
相关文章:
掌握Golang strings包:高效字符串处理指南
掌握Golang strings包:高效字符串处理指南 引言为什么要学习和掌握strings包本教程的目标 基本用法strings包概述导入strings包常用函数列表及简要介绍 字符串创建与基本操作创建字符串字符串连接:Join重复字符串:Repeat修改字符串࿱…...
关于husky8.0 与 4.0的配置
husky的场景使用很多,一般大多场景是在配置git commit 命令拦截hook, 校验 commit-msg 格式规范。以下环境默认:git > 2.27.0, node >14 1、安装huskey8.0.1 npm install --save-dev husky8.0.1 2、初始化配置文件 在package.json scripts 属性…...
【RK3588 Linux 5.x 内核编程】-Linux内核数据结构详解(双向链表、基数树、位数组)
Linux内核数据结构详解(双向链表、基数树、位数组) 文章目录 Linux内核数据结构详解(双向链表、基数树、位数组)1、双向链表2、基数树3、位数组3.1 Linux内核中的位数组和位操作3.2 位数组声明3.3 特定于架构的位操作3.4 常见的位操作Linux内核提供了不同的数据结构实现,如…...
3.Qt Quick-QML地图引擎之v4.3版本(新增动态轨迹线/海图/天地图街道/天地图卫星)
在上个版本Qt Quick-QML地图引擎之v4版本(新增多模型切换/3D模型欧拉角模拟)_qt加载3d地图-CSDN博客更新了3D模拟功能,在4.3版本增加动态轨迹线、三个地图(海图/天地图街道/天地图卫星)。 4.3版本已经支持qt6 cmake版本,而4.3版本以下支持qt5版本&#x…...
使用WebdriverIO和Appium测试App
1.新建项目 打开Webstorm新建项目 打开终端输入命令 npm init -y npm install wdio/cli allure-commandline --save-dev npx wdio config 然后在终端依次选择如下: 然后在终端输入命令: npm install wdio/local-runnerlatest wdio/mocha-frameworkla…...
前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单
一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置,在爬虫爬取网站文章时候,会输入给爬虫一个配置文件,里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…...
工具推荐:PDFgear——免费且强大的PDF编辑工具 v2.1.12
PDFgear——免费且强大的PDF编辑工具 v2.1.12 软件简介 PDFgear 是一款 完全免费的 PDF 软件,支持 阅读、编辑、转换、合并 以及 跨设备签署 PDF 文件,无需注册即可使用。它提供了丰富的 PDF 处理功能,极大提升了 PDF 文件管理的便捷性和效…...
【Unity3D】【已解决】TextMeshPro无法显示中文的解决方法
TextMeshPro无法显示中文的解决方法 现象解决方法Assets 目录中新建一个字体文件夹在C:\Windows\Fonts 中随便找一个中文字体的字体文件把字体文件拖到第一步创建的文件夹中右键导入的字体,Create---TextMeshPro---Font Asset,创建字体文件资源把 SDF文件…...
【Unity】使用UniRx来快速完成Unity中的信号层开发工作。
访问官方 网址:https://github.com/neuecc/UniRx/ UniRx(Unity反应式扩展)是.NET 反应式扩展的重新实现。官方 Rx 实现很棒,但在 Unity 上不起作用,并且存在 iOS IL2CPP 兼容性问题。此库修复了这些问题,并…...
FPGA工程师成长四阶段
朋友,你有入行三年、五年、十年的职业规划吗?你知道你所做的岗位未来该如何成长吗? FPGA行业的发展近几年是蓬勃发展,有越来越多的人才想要或已经踏进了FPGA行业的大门。很多同学在入行FPGA之前,都会抱着满腹对职业发…...
配置Kubernetes从节点与集群Calico网络
在上一篇博客中,我们成功安装并初始化了Kubernetes的主节点,并且看到了集群初始化成功的标志信息。接下来,我们将继续安装从节点(worker nodes),以构建一个完整的Kubernetes集群。 步骤回顾 在上一步中&a…...
【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统
文章目录 参考资料云盘资料软硬件环境手机解锁刷机驱动绑定账号和设备解锁手机 Mindows工具箱安装工具箱和修复下载下载安卓和woa资源包第三方Recovery 一键安装Windows准备工作创建分区安装系统 效果展示Windows和Android一键互换Win切换安卓安卓切换Win 删除分区 参考资料 解…...
【Qt】01-了解QT
踏入QT的殿堂之路 前言一、创建工程文件1.1 步骤介绍1.2 编译介绍方法1、方法2、编译成功 二、了解框架2.1 main.cpp2.2 .Pro文件2.2.1 注释需要打井号。2.2.2 F1带你进入帮助模式2.2.3 build文件 2.3 构造函数 三、编写工程3.1 main代码3.2 结果展示 四、指定父对象4.1 main代…...
STC的51单片机LED点灯基于KEIL
前言: 该文源于回答一个朋友的问题,代码为该朋友上传,略作修改,在此说明问题以及解决问题的思路,以减少新手错误。 电路图: 该位朋友未上传电路图,说明如下: stc8g1k08a-sop8控制…...
AV1视频编解码简介、码流结构(OBU)
我的音视频/流媒体开源项目(github) 目录 一、AV1编码技术 二、AV1码流结构(OBU) 三、IVF文件格式 四、ffmpeg支持AV1 五、关于常见格式对AV1的封装 一、AV1编码技术 AV1是由开放媒体联盟(AOM,Alliance for Open Media)在2018年发布的,AV1的前身…...
Service Work离线体验与性能优化
Service Work离线体验与性能优化 引言 先放个意外事件,万事开头难🤣🤣🤣 原计划是分享离线应用与数据资源缓存的应用实践,结果发现这一技术已被web标准废弃 曾经做过一个PC应用,业务需求要求应用具备容灾…...
linux之进程信号(初识信号,信号的产生)
目录 引入一、初识信号(信号预备知识)1.生活中的信号2.Linux中的信号3.信号进程得出的初步结论 二、信号的产生1.通过终端输入产生信号拓展: 硬件中断2.调用系统函数向进程发信号3.硬件异常产生信号4.软件条件产生信号拓展: 核心转储技术总结一下: 引入 一、初识信…...
为深度学习创建PyTorch张量 - 最佳选项
为深度学习创建PyTorch张量 - 最佳选项 正如我们所看到的,PyTorch张量是torch.Tensor PyTorch类的实例。张量的抽象概念与PyTorch张量之间的区别在于,PyTorch张量为我们提供了一个可以在代码中操作的具体实现。 在上一篇文章中,我们看到了…...
MySQL 与 Redis 数据一致性 2
1. 强一致还是最终一致?2. 先写 MySQL 还是先写Redis?case 1 3. 缓存(Redis)更新还是清除?更新策略更新策略会有数据不一致问题?数据不一致的概率与影响如果使用监听binlog更新数据还会出现数据不一致问题?binlog的消费问题 使用消息队列行不行?其他方案总结: 数据不一致…...
Git | git reset命令详解
关注:CodingTechWork 引言 Git 是一款非常流行的分布式版本控制工具,它帮助开发者有效地管理代码历史,支持多种功能来帮助团队协作、追踪修改和维护代码质量。git reset是 Git 中最强大、最复杂的命令之一,它的主要作用是重置当前…...
Linux高并发服务器开发 第十四天(dup/duo2/fcntl 进程 pcb进程控制块 环境变量)
目录 1.dup 和 dup2 1.1dup 1.2dup2 2.fcntl 3.进程 3.1进程和程序 3.2并发 3.3cpu 3.5pcb进程控制块 3.6进程状态 4.环境变量 1.dup 和 dup2 1.1dup - 将 文件描述符 ,复制产生“新文件描述符” 并返回。新、旧文件描述符,指向同一文件。 …...
[MySQL | 二、基本数据类型]
基本数据类型 一、数值类型举例表结构1. 整数类型zerofill属性 与 int(n) 中 n 的关系 2.bit类型3. 小数类型float类型decimal类型 二、字符串类型1. char2. varchar如何选择定长或变长字符串? 3. 日期时间类型(date datetime timestamp)4. enum枚举类型5. set多选类…...
第G1周:生成对抗网络(GAN)入门
>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客** >- **🍖 原作者:[K同学啊]** 本人往期文章可查阅: 深度学习总结 基础任务 1.了解什么是生成对抗网络2.生成对抗网络结构是怎么样的3.学习本文代码&am…...
ROS2 准备工作(虚拟机安装,Ubuntu安装,ROS2系统安装)
准备工作 虚拟机安装 大家可以自行去安装VMware链接:https://pan.baidu.com/s/1KcN1I9FN--Sp1bUsjKqWVA?pwd6666 提取码:6666(提供者:零基础编程入门教程) 教程:【【2025最新版】VMware虚拟机安装教程,手把手教你免…...
FreeType 介绍及 C# 示例
FreeType 是一个开源的字体渲染引擎,用于将字体文件(如 TrueType、OpenType、Type 1 等)转换为位图或矢量图形。它广泛应用于操作系统、图形库、游戏引擎等领域,支持高质量的字体渲染和复杂的文本布局。 FreeType 的核心功能 字体…...
BertTokenizerFast 和 BertTokenizer 的区别
BertTokenizerFast 和 BertTokenizer 都是用于对文本进行标记化的工具,主要用于处理和输入文本数据以供 BERT 模型使用。它们都属于 HuggingFace 的 transformers 库。 主要区别 底层实现: BertTokenizer: 这是一个使用纯 Python 实现的标记器ÿ…...
OpenGL中Shader LOD失效
1)OpenGL中Shader LOD失效 2)DoTween的GC优化 3)开发微信小程序游戏有没有类似Debug真机图形的方法 4)射线和Mesh三角面碰撞检测的算法 这是第418篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了U…...
[操作系统] 深入理解约翰·冯·诺伊曼体系
约翰冯诺依曼(John von Neumann,1903年12月28日—1957年2月8日),原名诺伊曼亚诺什拉约什(Neumann Jnos Lajos),出生于匈牙利的美国籍犹太人数学家,20世纪最重要的数学家之一…...
计算机网络(五)运输层
5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…...
网络分析仪测试S参数
S参数的测试 一:S参数的定义 S参数(Scattering Parameters,散射参数)是一个表征器件在射频信号激励下的电气行为的工具,它以输入信号、输出信号为元素的矩阵来表现DUT的“传输”和“散射”效应,输入、输出…...
什么是数据仓库?
什么是数据仓库? 数据仓库(Data Warehouse,简称DW)是一种面向分析和决策的数据存储系统,它将企业中分散的、异构的数据按照一定的主题和模型进行集成和存储,为数据分析、报表生成以及商业智能(…...
.NET8.0多线程编码结合异步编码示例
1、创建一个.NET8.0控制台项目来演示多线程的应用 2、快速创建一个线程 3、多次运行程序,可以得到输出结果 这就是多线程的特点 - 当多个线程并行执行时,它们的具体执行顺序是不确定的,除非我们使用同步机制(如 lock、信号量等&am…...
使用 Charles 调试 Flutter 应用中的 Dio 网络请求
为了成功使用 Charles 抓取并调试 Flutter 应用程序通过 Dio 发起的网络请求,需遵循特定配置步骤来确保应用程序能够识别 Charles 的 SSL 证书,并正确设置代理服务器。 配置 Charles 以支持 HTTPS 请求捕获 Charles 默认会拦截 HTTP 流量;…...
老centos7 升级docker.io为docker-ce 脚本
旧的centos7 之前安装的是docker.io 由于一些原因,像docker compose 等版本变化,以及docker.io源受限等,我们要更新到docker-ce 并使用国内阿里云的源怎么处理?下面直接上脚本,upgrade-docker.sh #!/bin/bashset -e# 创建临时目录 TEMP_DIR"./tmp" mkdir -p "…...
Go Ebiten小游戏开发:贪吃蛇
贪吃蛇是一款经典的小游戏,玩法简单却充满乐趣。本文将介绍如何使用 Go 语言和 Ebiten 游戏引擎开发一个简单的贪吃蛇游戏。通过这个项目,你可以学习到游戏开发的基本流程、Ebiten 的使用方法以及如何用 Go 实现游戏逻辑。 项目简介 贪吃蛇的核心玩法是…...
c语言----------内存管理
内存管理 目录 一。作用域1.1 局部变量1.2 静态(static)局部变量1.3 全局变量1.4 静态(static)全局变量1.5 extern全局变量声明1.6 全局函数和静态函数1.7 总结 二。内存布局2.1 内存分区2.2 存储类型总结2.3内存操作函数1) memset()2) memcpy()3) memmove()4) memcmp() 2.4 堆…...
在一个sql select中作多个sum并分组
有表如下; 单独的对某一个列作sum并分组,结果如下; 对于表的第7、8行,num1都有值,num2都是null,对num2列作sum、按id分组,结果在id为4的行会显示一个null; 同时对2个列作sum&#x…...
如何修复Android上未安装的应用程序
在Android设备上安装应用程序通常是一个简单的过程。然而,“ Android上未安装应用程序”是一种常见的智能手机错误消息,由于一个或多个原因而经常遇到。发现由于即将出现故障而无法充分利用手机,这当然会非常令人沮丧,但幸运的是&…...
#CSS混合模式:解决渐变背景下的文字可见性问题
在现代网页设计中,渐变背景的使用越来越普遍。然而,当我们在渐变背景上放置文字时,常常会遇到一个问题:文字在某些背景颜色下可能变得难以阅读。今天,我们将探讨一个优雅的解决方案:使用CSS混合模式。 问题…...
微信小程序原生与 H5 交互方式
在微信小程序中,原生与 H5 页面(即 WebView 页面)之间的交互通常有以下几种方式: 1. 使用 postMessage 进行通信 微信小程序的 WebView 页面和原生小程序页面可以通过 postMessage 来进行数据传递。 WebView 页面向原生小程序发…...
kotlin中的flow使用,Flow跟生命周期结合
kotlin的Flow可以连续异步发出多个数据。 1. 普通flow,冷流类似于一个函数,当开始收集时才开始运行 val coldStream flow {for (i in 1..5) {delay(100L)emit(i)}} val collect1 buildString {coldStream.collect { append(it).append(", ") } }.remo…...
讲一下ZooKeeper的持久化机制?
大家好,我是锋哥。今天分享关于【讲一下ZooKeeper的持久化机制?】面试题。希望对大家有帮助; 讲一下ZooKeeper的持久化机制? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务&…...
mybatis里面实现动态升降序
问题 最近有一个需求,需要前端告诉后端按照某个字段进行排序。这里主要侧重mybatis的xml实现,其他Spring集成就忽略了。 mapper xml实现 <if test"sortField ! null and sortField ! ">ORDER BY<choose><when test"sor…...
探索网络安全:浅析文件上传漏洞
前言 在数字化时代,网络安全已成为我们每个人都需要关注的重要议题。无论是个人隐私保护,还是企业数据安全,网络威胁无处不在。了解网络安全的基本知识和防护措施,对我们每个人来说都至关重要。 网络安全 网络安全并非只是对网…...
【C++】B2112 石头剪子布
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述游戏规则:输入格式:输出格式:输入输出样例:解题分析与实现 💯我的做法实现逻辑优点与不足 💯…...
java根据模板导出word,并在word中插入echarts相关统计图片以及表格
引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题,需要处理将ftl文件中的图片的Base64删除,并使用占位符代替插入表格,并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…...
Linux网络知识——路由表
路由表 1 定义与作用 Linux路由表是一个内核数据结构,用于描述Linux主机与其他网络设备之间的路径,以及如何将数据包从源地址路由到目标地址。路由表的主要作用是指导数据包在网络中的传输路径,确保数据包能够准确、高效地到达目标地址。 …...
ImageSharp图形库学习
一、引言 在当今数字化时代,无论是 Web 应用、桌面程序,还是移动应用,图像处理都扮演着至关重要的角色。从电商平台展示商品图片,到社交媒体分享照片,再到各种软件的图标设计,图像处理无处不在。博主们在内…...
Android string.xml中特殊字符转义
项目中要在string.xml 中显示特殊符号 空格: (普通的英文半角空格但不换行) 窄空格: (中文全角空格 (一个中文宽度)) (半个中文宽度,但两个空格比一个中文…...
Rust 游戏开发框架指南
Rust 游戏开发框架指南 主流游戏引擎 1. Bevy 最受欢迎的 Rust 游戏引擎之一,基于 ECS(实体组件系统)架构。 特点: 🚀 高性能 ECS 系统📦 热重载支持🎨 现代渲染器🔊 内置音频系…...