Go字符串操作技巧

Posted John00000001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go字符串操作技巧相关的知识,希望对你有一定的参考价值。

定义多行字符串

Go语言中定义多行字符串可以使用反勾号(backtick),比如下面的定义:

var tools= `
UI for overview of your Golang
package benchmarks progress.
`

需要主要的是,打印输出的任何空格字符与原来的多行定义一模一样。

fmt.Printf("[%s]", tool)

输出结果:

[
TOOLS:
UI for overview of your Golang
package benchmarks progress.
]

高效字符串拼接

最常用的是使用字符+号拼接两个字符,但是对于多个字符频繁拼接就会严重影响运行的性能。更加高效的方式就是使用bytes.Buffer,当拼接完所有字符串后直接转化为字符串。此外,你可以构建一个字符串切片,最后调用strings.Join函数。

实例代码,‘+’操作符拼接:

func doConcatenation1()
    str := "abc "+ "cba"
    fmt.Println("str=", str)

bytes.Buffer拼接字符串操作:

func doConcatenation2()
    var buffer bytes.Buffer
    for i:=0; i < 1000; i++ 
        buffer.WriteString(strconv.Itoa(i))
    
    fmt.Println(buffer.String())

strings.Join函数操作:

func doConcatenation3()
    var strs []string
    for i:=0; i < 1000; i++ 
        strs = append(strs, strconv.Itoa(i))
    
    fmt.Println(strings.Join(strs, ""))

另外,值得注意的是Go1.10版本提供了新的字符串拼接函数strings.Builder.

//Only works for Go1.10 version
func doConcatenation4()
    var b strings.Builder
    for i := 1000 ; i >= 1; i-- 
        fmt.Fprintf(&b, "%d...", i)
    
    b.WriteString("ignition")
    fmt.Println(b.String())

经验总结,一般少量字符串直接用‘+’,超过一定量的字符拼接用bytes.Buffer(如果是切片类型的字符串,也可以使用函数strings.Join). 如果使用的是Go1.10版本,可以优先选择函数strings.Builder.

代码实例:

var b strings.Builder
for i := 0; i < 1000; i++ 
    fmt.Fprintf(&b, "%d", i)

b.WriteString("ignition")
fmt.Println(b.String())

整型数值转化为字符串

Go编程中,偶尔也需要将整型类型的数值转化为字符串的情况。此刻,你有两种策略解决这个问题。第一,使用函数strconv.Itoa,但是,它无法处理int64类型的情况。第二,使用函数fmt.Sprintf函数,需要根据表达式格式%d得到字符串的值。

代码实例:

func convertInt(i int) string
    return strconv.Itoa(i)


func convertInt64(i int64) string 
    return fmt.Sprintf("%d", i)


func testConverting()
    var i int = 100
    var j int64 = 2000000
    fmt.Println("i:", convertInt(i))
    fmt.Println("j:", convertInt64(j))

注意,由于fmt.Sprintf不会做任何类型检测,这样无形之中就可能会隐藏bug。另外,从执行速度上而言,fmt.Sprintfstrconv.Itoa会更慢一点。

字符串转化为字节切片

在Go编程中,你可能会遇到将字符串转化为字节切片或者从字节切片转化为字符串的时候,实现起来很容易,有点像任意类型转换一样。

代码实例:

s := "Cloud native go programming"
b := []byte(s)
fmt.Println("byte[]:", b)
s = string(b)
fmt.Println("string b:", s)

欢迎加入我的微信公众号

以上是关于Go字符串操作技巧的主要内容,如果未能解决你的问题,请参考以下文章

while语句的一个使用技巧

你知道的Go切片扩容机制可能是错的

15. Go 语言“避坑”与技巧

技巧:Go 结构体如何转换成 map[string]interface{}

Go函数

Go切片与技巧(附图解)