站长资讯网
最全最丰富的资讯网站

常见的 Go 处理字符串的技巧

常见的 Go 处理字符串的技巧

1、多行字符串

str := `This is a multiline string.`

注意 – 任何你在字符串中的缩进都将被保留在最终结果。

str := `This string     will have     tabs in it`

2. 高效的字符串连接方式

Go 允许你通过 "+" 的方式连接字符串,但这种方式在处理大量字符串连接的场景下将非常低效。使用 bytes.Buffer 连接字符串是一个更高效的方式,它会一次性将所有的内容连接起来转化成字符串。

package main import (     "bytes"     "fmt" ) func main() {     var b bytes.Buffer     for i := 0; i < 1000; i++ {         b.WriteString(randString())     }     fmt.Println(b.String()) } func randString() string {     // 模拟返回一个随机字符串     return "abc-123-" }

如果你提前准备好所有字符串,你也可以通过 strings.Join 的方式实现。

package main import (     "fmt"     "strings" ) func main() {     var strs []string     for i := 0; i < 1000; i++ {         strs = append(strs, randString())     }     fmt.Println(strings.Join(strs, "")) } func randString() string {     // 模拟返回一个随机字符串     return "abc-123-" }

3. 将整型 (或任意数据类型) 转为字符串

在大多数语言中,可轻易地将任意数据类型转型为字符串进行拼接,或用字符串插入(例如在 ruby 中这样 "ID=#{id}")。很不幸,如果你尝试在 Go 中去做这种显示而易见的操作,比如强制将整形转为字符串,你不会得到期望的结果。

i := 123 s := string(i)

你希望 s 的输出是多少?如果你像大多数人一样猜测 "123",那你就大错特错了。相反,你会得到类似 "E" 的值。这根本不是我们想要的!

相反,您应该使用像 [strconv] (https://golang.org/pkg/strconv/) 这样的包或像 fmt.Sprintf 这样的函数。例如,下面是一个使用 strconv.Itoa 将整数转换为字符串的示例。

package main import (     "fmt"     "strconv" ) func main() {     i := 123     t := strconv.Itoa(i)     fmt.Println(t) }

你还可以使用 fmt.Sprintf 函数将几乎所有数据类型转换为字符串,但通常应保留在这样的实例上,如正在创建的字符串包含嵌入数据,而非在期望将单个整数转换为字符串时用。

package main import "fmt" func main() {     i := 123     t := fmt.Sprintf("We are currently processing ticket number %d.", i)     fmt.Println(t) }

Sprintf 的操作与 fmt.Printf 几乎相同,只是它没有将结果字符串输出到标准输出,而是将其作为字符串返回。

限制使用 Sprintf

如前所述,fmt.Sprintf 通常应用在创建具有嵌入值的字符串。这有几个原因,但最突出的一个原因是 fmt.Sprintf 不做任何类型检查,因此在实际运行代码之前,您不太可能发现任何错误。

Sprintf 也比你通常在 strconv 包中使用的大多数函数慢,不过如果我说实话,速度差异是如此之小,一般不值得考虑。

4. 创建随机字符串

这并不是一个真正的「快速技巧」,但我发现这是一个经常被问到的问题。

如何在 Go 中创建随机的字符串?

听上去很简单。许多语言,比如 Ruby 和 Python,都提供了一些帮助程序,使随机字符串的生成变得非常简单,所以 Go 肯定有这样一个工具,对吧?答案是错误的。

Go 选择只提供创建随机字符串的工具,而将细节留给开发人员。虽然一开始可能会有些困难,但好处是您可以完全决定如何生成字符串。 这意味着您可以指定字符集、如何播种随机生成以及任何其他详细信息。简而言之,你有

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号