当前位置 主页 > 网站技术 > 代码类 >

    分享6个Go处理字符串的技巧小结

    栏目:代码类 时间:2019-12-08 12:07

    如果你从 Ruby 或者 Python 转型到 Go,将会有很多语言差异需要学习,其中很多问题都是围绕处理 string 类型。

    下面是一些字符串的技巧,这些技巧解决了我在使用 Golang 的最初几周中遇到的问题。

    1. 多行字符串

    在 Go 中创建多行字符串非常容易。只需要在你声明或赋值时使用 (``) 。

    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. 创建随机字符串