go基础库之将字符串与writer连接

栏目: Go · 发布时间: 5年前

内容简介:除了内置的+运算符之外,还有更多的方法可以连接字符串。本篇将用

除了内置的+运算符之外,还有更多的方法可以连接字符串。本篇将用 bytes 包和内置 copy 函数,作为连接字符串的更有效的方法。

将字符串与writer连接

Golang 版本

1.12.1

前言

除了内置的+运算符之外,还有更多的方法可以连接字符串。本篇将用 bytes 包和内置 copy 函数,作为连接字符串的更有效的方法。

实现

  1. 创建文件 concat_buffer.go ,代码如下:

    package main
    
    import (
    	"bytes"
    	"fmt"
    )
    
    func main() {
    	strings := []string{"This ", "is ", "even ",
    		"more ", "performant "}
    	buffer := bytes.Buffer{}
    	for _, val := range strings {
    		buffer.WriteString(val)
    	}
    
    	fmt.Println(buffer.String())
    }
    
    $ go run concat_buffer.go
    This is even more performant
    
  2. 创建文件 concat_copy.go ,代码如下:

    package main
    
    import (
    "fmt"
    )
    
    func main() {
    
    	strings := []string{"This ", "is ", "even ",
    		"more ", "performant "}
    
    	bs := make([]byte, 100)
    	bl := 0
    
    	for _, val := range strings {
    		bl += copy(bs[bl:], []byte(val))
    	}
    
    	fmt.Println(string(bs[:]))
    
    }
    
    $ go run concat_copy.go
    This is even more performant
    

原理

步骤1使用 bytes 包的 Buffer 作为字符串连接性能友好的解决方案。 Buffer 结构体实现 WriteString 方法,该方法可用于有效地将字符串连接到底层字节片中。

没有必要在所有情况下都使用这种改进,只要考虑一下程序将连接大量字符串的情况(例如,内存中的CSV导出和其他)。

步骤2中提供的内置 copy 函数可用于完成 string 的连接。这种方法需要对最终字符串长度做一些假设,或者可以动态地完成。但是,如果写入结果的缓冲区的容量小于已经写入的部分和要追加的字符串的总和,则必须扩展缓冲区(通常通过分配容量更大的新片)。

延伸

仅作比较,有一个基准代码,用于比较内置+运算符 bytes.Buffer 和内置 copy 方法的性能:

创建文件夹 bench ,并创建文件 bench_test.go ,代码如下:

package main

import (
	"bytes"
	"testing"
)

const testString = "test"

func BenchmarkConcat(b *testing.B) {
	var str string
	b.ResetTimer()
	for n := 0; n < b.N; n++ {
		str += testString
	}
	b.StopTimer()
}

func BenchmarkBuffer(b *testing.B) {
	var buffer bytes.Buffer

	b.ResetTimer()
	for n := 0; n < b.N; n++ {
		buffer.WriteString(testString)
	}
	b.StopTimer()
}

func BenchmarkCopy(b *testing.B) {
	bs := make([]byte, b.N)
	bl := 0

	b.ResetTimer()
	for n := 0; n < b.N; n++ {
		bl += copy(bs[bl:], testString)
	}
	b.StopTimer()
}
$ go test -bench=.
goos: windows
goarch: amd64
pkg: Go-Standard-library/Concatenating-a-string-with-writer/bench
BenchmarkConcat-4         300000             95719 ns/op
BenchmarkBuffer-4       100000000               12.6 ns/op
BenchmarkCopy-4         300000000                4.36 ns/op
PASS
ok      Go-Standard-library/Concatenating-a-string-with-writer/bench    32.345s

以上所述就是小编给大家介绍的《go基础库之将字符串与writer连接》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Bandit Algorithms for Website Optimization

Bandit Algorithms for Website Optimization

John Myles White / O'Reilly Media / 2013-1-3 / USD 19.99

This book shows you how to run experiments on your website using A/B testing - and then takes you a huge step further by introducing you to bandit algorithms for website optimization. Author John Myle......一起来看看 《Bandit Algorithms for Website Optimization》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具