您好,登录后才能下订单哦!
本篇内容主要讲解“Golang中字符串拼接问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang中字符串拼接问题怎么解决”吧!
Go的字符串是一个不可改变的数据结构,这和其他语言如JAVA,C++等的设定很类似.总体来说,有如下五种拼接方式,下面我们将论述各种方式的性能问题,以及如何选择.
(golang字符串,内存模型)
type StringHeader struct { Data uintptr Len int }
注意:字符串具有不可改变的特性,即便通过指针等变相操作
var a string = "old" bptr := (*reflect.StringHeader)(unsafe.Pointer(&a)) dataPtr := (*byte)(unsafe.Pointer(bptr.Data)) var b = [3]byte{'n', 'e', 'w'} *dataPtr = b[0] //报错 fmt.Println(bptr)
方式一、直接+
当使用连接符 + 拼接两个字符串时,会生成一个新的字符串并开辟新的内存空间,空间大小等于两个字符串之和。在训中中时,不断拼接新的字符串,这样就会不断申请内存空间, 性能就会越来越差。 所以,在字符串密集拼接场景中,使用 + 会严重降低性能。包括热路径的代码.
方式二、strings.Builder
func Benchmark_StringsBuilder(b *testing.B) { var sb strings.Builder for i := 0; i < b.N; i++ { sb.WriteString("hello world") } _ = sb.String() }
方式三、bytes.Buffer
func Benchmark_BytesBuffer(b *testing.B) { var buf bytes.Buffer for i := 0; i < b.N; i++ { buf.WriteString("hello world") } _ = buf.String() }
方式四、fmt.Fprint(&buf,&str)
方式五、strings.Join
性能不是最优,但在切片的情况下,可以用来拼接
Benchmark_StringAdd Benchmark_StringAdd-8 117806 127059 ns/op Benchmark_BytesBuffer Benchmark_BytesBuffer-8 38938282 25.88 ns/op Benchmark_StringsBuilder Benchmark_StringsBuilder-8 57249450 18.53 ns/op
3.1 性能方面,strings.Builder 比 bytes.Buffer 快差不多 20%,
原因:strings.Builder 和 bytes.Buffer 底层都是一个 []byte,但是 bytes.Buffer 转换字符串时会重新申请内存空间用来存放, 而 strings.Builder 直接将底层的 []byte 利用指针的方式强转为字符串.
//strings.Builder的String() func (b *Builder) String() string { return *(*string)(unsafe.Pointer(&b.buf)) } //bytes.Builder的String() func (b *Buffer) String() string { if b == nil { // Special case, useful in debugging. return "<nil>" } return string(b.buf[b.off:]) }
3.2 strings.Builder通常性能最优,但底层依赖于[]byte,所以如果平凡扩容就不妙了,因此我们需要借助它的Grow方法,以已分配最终[]byte的容量,避免因为扩容带来的性能损失
func Benchmark_StringConcat(b *testing.B) { str := "hello world" var sb strings.Builder sb.Grow(b.N * len(str)) for i := 0; i < b.N; i++ { sb.WriteString(str) } _ = sb.String() }
3.3 strings.Builder没有拷贝构造(借用C++说法),因为
type Builder struct { addr *Builder // of receiver, to detect copies by value buf []byte //如果拷贝,这个buf共享,最后导致数据混乱 }
到此,相信大家对“Golang中字符串拼接问题怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。