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

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

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

除了内置的+运算符之外,还有更多的方法可以连接字符串。本篇将用 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连接》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

数据结构与算法分析

数据结构与算法分析

张琨、张宏、朱保平 / 人民邮电出版社 / 2016-2-1 / 45

本书共分10章,主要包括第1章绪论,第2章线性表,第3章栈和队列,第4章串,第5章数组和广义表,第6章 树和二叉树,第7章图,第8章查找,第9章内部排序,第10章算法分析。其内容模块涵盖了课堂教学、习题课教学、实验教学、自学辅导、综合训练等。立体化教材的使用在提高教学效率、增强教学效果、加大教学信息量、培养学生的应用与实践能力。 作者简介一起来看看 《数据结构与算法分析》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

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

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码