前言
在 go 语言编程中,字符串是最基本、最常用的数据类型之一。无论是处理用户输入、读取文件内容,还是生成输出,字符串操作无处不在。为了方便开发者对字符串进行各种操作,go 语言提供了强大的 strings 包和 strconv 包。strings 包包含了一系列函数,用于处理和操作字符串,如查找、替换、分割、拼接等。strconv 包则专注于字符串与其他基本数据类型之间的转换,使得数据处理更加简洁高效。在这篇文章中,我们将深入探讨 go 语言中的字符串处理方法,并详细介绍 strings 包和 strconv 包的主要功能和用法,帮助您更好地掌握字符串操作技巧,提高编程效率。
1、go 语言中的字符串
1.1、go 语言
在 go 语言中,字符串是 utf-8 编码字符的序列。对于 ascii 字符,每个字符占用 1 个字节,而其他字符根据需要占用 2 至 4 个字节。utf-8 是一种广泛使用的编码格式,许多标准文本文件(如 xml 和 json)都采用这种编码。由于 utf-8 编码的可变长度特性,go 语言中的字符串也可能占用 1 到 4 个字节,这与 c++、java 或 python 不同(例如,java 始终使用 2 个字节)。这种设计不仅减少了内存和硬盘空间的占用,还免去了对 utf-8 文本进行编码和解码的繁琐操作。
字符串在 go 中是一种值类型,且值不可变。这意味着一旦创建了字符串,就不能修改其内容。更深入地讲,字符串是字节的定长数组。
1.2、字符串字面值
go 支持两种形式的字符串字面值:
解释字符串(interpreted strings):
- 使用双引号括起来。
- 转义字符会被替换,例如:
\n表示换行符,\t表示制表符,\u或\u表示 unicode 字符,\\表示反斜杠本身。
示例:
var str = "hello, world!\n"
非解释字符串(raw strings):
- 使用反引号括起来。
- 支持多行字符串,转义字符不会被替换,所有内容都会原样输出。
示例:
var rawstr = `this is a raw string \n`
在 go 中,字符串是通过长度来限定的,而不是像 c/c++ 那样通过特殊字符 \0 结束。string 类型的零值是长度为零的字符串,即空字符串 ""。
1.3、字符串比较和操作
字符串可以通过常见的比较运算符(==、!=、<、<=、>=、>)按字节在内存中进行比较。可以使用 len() 函数获取字符串的字节长度:
len("hello") // 5
字符串的内容(字节)可以通过索引访问,索引从 0 开始:
var str = "hello" str[0] // 'h' str[len(str)-1] // 'o'
需要注意的是,这种索引方式只对纯 ascii 字符串有效。对于 unicode 字符,需要使用 unicode/utf8 包提供的方法。
1.4、字符串拼接
字符串可以使用 + 运算符拼接:
var s1 = "hello" var s2 = "world" var s = s1 + " " + s2 // "hello world"
也可以使用 += 运算符进行拼接:
var s = "hello" s += ", " s += "world!" // "hello, world!"
在循环中使用 + 进行字符串拼接并不是最高效的方法。更好的方法是使用 strings.join() 函数,或者使用 bytes.buffer 进行高效的字符串拼接。
1.5、字符串的其他操作
在 go 语言中,可以将字符串视为字节(byte)的切片(slice),从而实现标准索引操作。使用 for 循环可以根据索引返回字符串中的字节。而使用 for-range 循环可以对 unicode 字符串进行迭代操作。
此外,go 语言提供了丰富的字符串操作函数和方法,可以在标准库的 strings 和 unicode/utf8 包中找到。例如,可以使用 fmt.sprint(x) 来格式化生成并返回字符串。
1.6、示例:统计字节和字符
创建一个程序用于统计字符串中的字节和字符数量。例如,分析字符串 "assasa ddd dsjkdsjs dk" 和 "assasa ddd dsjkdsjsこん dk",并解释两者不同的原因(提示:使用 unicode/utf8 包)。
示例代码:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str1 := "assasa ddd dsjkdsjs dk"
str2 := "assasa ddd dsjkdsjsこん dk"
fmt.printf("string: %s\n", str1)
fmt.printf("bytes: %d, runes: %d\n", len(str1), utf8.runecountinstring(str1))
fmt.printf("string: %s\n", str2)
fmt.printf("bytes: %d, runes: %d\n", len(str2), utf8.runecountinstring(str2))
}
该程序统计并输出字符串的字节数和字符(rune)数,从而展示 utf-8 编码在处理不同字符时的差异。
2、strings 和 strconv 包
在 go 语言中,字符串作为一种基本数据结构,有许多预定义的处理函数。strings 包用于对字符串进行主要操作,而 strconv 包用于字符串与其他类型之间的转换。
2.1、strings 包
strings 包提供了丰富的字符串操作函数,以下是一些常用操作:
2.1.1、前缀和后缀
strings.hasprefix(s, prefix string) bool:判断字符串s是否以prefix开头。strings.hassuffix(s, suffix string) bool:判断字符串s是否以suffix结尾。
示例:
package main
import (
"fmt"
"strings"
)
func main() {
str := "this is an example of a string"
fmt.printf("t/f? does the string \"%s\" have prefix %s? ", str, "th")
fmt.printf("%t\n", strings.hasprefix(str, "th"))
}
输出:
t/f? does the string "this is an example of a string" have prefix th? true
2.1.2、字符串包含关系
strings.contains(s, substr string) bool:判断字符串s是否包含子字符串substr。
2.1.3、判断子字符串或字符在父字符串中出现的位置(索引)
strings.index(s, str string) int:返回子字符串str在字符串s中的第一个出现位置的索引,-1 表示不包含。strings.lastindex(s, str string) int:返回子字符串str在字符串s中最后一次出现位置的索引,-1 表示不包含。strings.indexrune(s string, r rune) int:返回字符r在字符串s中的索引。
示例:
package main
import (
"fmt"
"strings"
)
func main() {
str := "hi, i'm marc, hi."
fmt.printf("the position of \"marc\" is: %d\n", strings.index(str, "marc"))
fmt.printf("the position of the first instance of \"hi\" is: %d\n", strings.index(str, "hi"))
fmt.printf("the position of the last instance of \"hi\" is: %d\n", strings.lastindex(str, "hi"))
fmt.printf("the position of \"burger\" is: %d\n", strings.index(str, "burger"))
}
输出:
the position of "marc" is: 8
the position of the first instance of "hi" is: 0
the position of the last instance of "hi" is: 14
the position of "burger" is: -1
2.1.4、字符串替换
strings.replace(str, old, new string, n int) string:将字符串str中的前n个字符串old替换为字符串new,并返回一个新的字符串。如果n = -1,则替换所有字符串old。
2.1.5、统计字符串出现次数
strings.count(s, str string) int:计算字符串str在字符串s中出现的非重叠次数。
示例:
package main
import (
"fmt"
"strings"
)
func main() {
str := "hello, how is it going, hugo?"
manyg := "gggggggggg"
fmt.printf("number of h's in %s is: %d\n", str, strings.count(str, "h"))
fmt.printf("number of double g's in %s is: %d\n", manyg, strings.count(manyg, "gg"))
}
输出:
number of h's in hello, how is it going, hugo? is: 2
number of double g’s in gggggggggg is: 5
2.1.6、重复字符串
strings.repeat(s, count int) string:返回一个新的字符串,该字符串由count次重复字符串s组成。
示例:
package main
import (
"fmt"
"strings"
)
func main() {
origs := "hi there! "
news := strings.repeat(origs, 3)
fmt.printf("the new repeated string is: %s\n", news)
}
输出:
the new repeated string is: hi there! hi there! hi there!
2.1.7、修改字符串大小写
strings.tolower(s) string:将字符串s中的所有 unicode 字符转换为小写。strings.toupper(s) string:将字符串s中的所有 unicode 字符转换为大写。
示例:
package main
import (
"fmt"
"strings"
)
func main() {
orig := "hey, how are you george?"
fmt.printf("the original string is: %s\n", orig)
fmt.printf("the lowercase string is: %s\n", strings.tolower(orig))
fmt.printf("the uppercase string is: %s\n", strings.toupper(orig))
}
输出:
the original string is: hey, how are you george?
the lowercase string is: hey, how are you george?
the uppercase string is: hey, how are you george?
2.1.8、修剪字符串
strings.trimspace(s):剔除字符串开头和结尾的空白符号。strings.trim(s, cutset):剔除字符串开头和结尾的指定字符cutset。strings.trimleft(s, cutset):剔除字符串开头的指定字符cutset。strings.trimright(s, cutset):剔除字符串结尾的指定字符cutset。
2.1.9、分割字符串
strings.fields(s):根据空白符分割字符串,返回一个字符串切片。strings.split(s, sep):根据指定的分隔符sep分割字符串,返回一个字符串切片。
示例:
package main
import (
"fmt"
"strings"
)
func main() {
str := "the quick brown fox jumps over the lazy dog"
sl := strings.fields(str)
fmt.printf("splitted in slice: %v\n", sl)
for _, val := range sl {
fmt.printf("%s - ", val)
}
fmt.println()
str2 := "go1|the abc of go|25"
sl2 := strings.split(str2, "|")
fmt.printf("splitted in slice: %v\n", sl2)
for _, val := range sl2 {
fmt.printf("%s - ", val)
}
fmt.println()
str3 := strings.join(sl2, ";")
fmt.printf("sl2 joined by ;: %s\n", str3)
}
输出:
splitted in slice: [the quick brown fox jumps over the lazy dog]
the - quick - brown - fox - jumps - over - the - lazy - dog -
splitted in slice: [go1 the abc of go 25]
go1 - the abc of go - 25 -
sl2 joined by ;: go1;the abc of go;25
2.1.10、拼接 slice 到字符串
strings.join(sl []string, sep string) string:将元素类型为string的 slice 使用分割符sep拼接成一个字符串。
2.1.11、从字符串中读取内容
strings.newreader(str):生成一个 reader 并读取字符串中的内容,然后返回指向该 reader 的指针。
示例:
package main
import (
"fmt"
"strings"
)
func main() {
str := "the quick brown fox jumps over the lazy dog"
sl := strings.fields(str)
fmt.printf("splitted in slice: %v\n", sl)
for _, val := range sl {
fmt.printf("%s - ", val)
}
fmt.println()
str2 := "go1|the abc of go|25"
sl2 := strings.split(str2, "|")
fmt.printf("splitted in slice: %v\n", sl2)
for _, val := range sl2 {
fmt.printf("%s - ", val)
}
fmt.println()
str3 := strings.join(sl2,";")
fmt.printf("sl2 joined by ;: %s\n", str3)
}
输出:
splitted in slice: [the quick brown fox jumps over the lazy dog]
the - quick - brown - fox - jumps - over - the - lazy - dog -
splitted in slice: [go1 the abc of go 25]
go1 - the abc of go - 25 -
sl2 joined by ;: go1;the abc of go;25
更多字符串操作的文档请参阅官方文档。
2.2、strconv 包
strconv 包用于字符串与其他基本数据类型之间的转换。
2.2.1、将其他类型转换为字符串
strconv.itoa(i int) string:将整数转换为字符串。strconv.formatfloat(f float64, fmt byte, prec int, bitsize int) string:将浮点数转换为字符串,fmt表示格式,prec表示精度,bitsize用于区分float32和float64。
示例:
package main
import (
"fmt"
"strconv"
)
func main() {
var i int =
123
var f float64 = 3.14159
s1 := strconv.itoa(i)
s2 := strconv.formatfloat(f, 'f', -1, 64)
fmt.printf("integer to string: %s\n", s1)
fmt.printf("float to string: %s\n", s2)
}
输出:
integer to string: 123
float to string: 3.14159
2.2.2、将字符串转换为其他类型
strconv.atoi(s string) (int, error):将字符串转换为整数。strconv.parsefloat(s string, bitsize int) (float64, error):将字符串转换为浮点数。
示例:
package main
import (
"fmt"
"strconv"
)
func main() {
var str string = "666"
var anint int
var newstr string
anint, _ = strconv.atoi(str)
fmt.printf("the integer is: %d\n", anint)
anint += 5
newstr = strconv.itoa(anint)
fmt.printf("the new string is: %s\n", newstr)
}
输出:
the integer is: 666
the new string is: 671
strconv 包中还包含了一些辅助变量,如 strconv.intsize,用于获取当前平台下 int 类型的大小(位数)。
通过 strings 和 strconv 包的强大功能,go 语言提供了丰富的字符串处理和转换工具,使得开发者能够高效地处理和转换字符串数据。
附:go语言中在数字中读取小数点在数字字符串的哪一位
在 go 语言中,可以使用 strconv 包中的 parsefloat 函数将字符串转换为数字,并读取小数点在字符串的哪一位。具体的使用方法如下:
import "strconv" str := "123.456789" num, _ := strconv.parsefloat(str, 64) // 将[字符串](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjpzci6ndq0mdg2miwizxhwijoxnza3mzcxotm4lcjpyxqioje3mdy3njcxmzgsinvzzxjuyw1lijoid2vpegluxzy4njq1njq1in0.rrtyenmnypc7aqdoij4sbb0kkeghoyvf-bzog2egqvc&spm=1055.2569.3001.10083)转换为 float64 类型的数字 dotindex := strings.index(strconv.formatfloat(num, 'f', -1, 64), ".") // 读取小数点在[字符串](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjpzci6ndq0mdg2miwizxhwijoxnza3mzcxotm4lcjpyxqioje3mdy3njcxmzgsinvzzxjuyw1lijoid2vpegluxzy4njq1njq1in0.rrtyenmnypc7aqdoij4sbb0kkeghoyvf-bzog2egqvc&spm=1055.2569.3001.10083)中的位置 fmt.println(dotindex) // 输出为 3
在 parsefloat 函数中,第一个参数表示需要转换为数字的字符串,第二个参数表示使用 float64 类型进行转换。在上面的例子中,我们将字符串转换为数字后,使用 formatfloat 函数读取小数点在字符串中的位置。在 formatfloat 函数中,'f' 表示格式化为浮点数,-1 表示不限制小数位数,64 表示使用 float64 类型的数字进行格式化。然后使用 strings 包中的 index 函数读取小数点在字符串中的位置。
总结
到此这篇关于go语言字符串及strings和strconv包使用的文章就介绍到这了,更多相关go字符串strings和strconv包内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论