广告
返回顶部
首页 > 资讯 > 后端开发 > GO >浅析Golang中字符串拼接问题
  • 931
分享到

浅析Golang中字符串拼接问题

Golang字符串拼接Go字符串拼接Golang字符串 2023-05-15 08:05:00 931人浏览 八月长安
摘要

目录1.概述2.golang中字符串拼接的方式3.总结1.概述 Go的字符串是一个不可改变的数据结构,这和其他语言如JAVA,c++等的设定很类似.总体来说,有如下五种拼接方式,下面

1.概述

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)

2.Golang中字符串拼接的方式

方式一、直接+

当使用连接符 + 拼接两个字符串时,会生成一个新的字符串并开辟新的内存空间,空间大小等于两个字符串之和。在训中中时,不断拼接新的字符串,这样就会不断申请内存空间, 性能就会越来越差。 所以,在字符串密集拼接场景中,使用 + 会严重降低性能。包括热路径的代码.

方式二、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

性能不是最优,但在切片的情况下,可以用来拼接

3.总结

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中字符串拼接问题的文章就介绍到这了,更多相关Golang字符串拼接内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 浅析Golang中字符串拼接问题

本文链接: https://www.lsjlt.com/news/208694.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅析Golang中字符串拼接问题
    目录1.概述2.Golang中字符串拼接的方式3.总结1.概述 Go的字符串是一个不可改变的数据结构,这和其他语言如JAVA,C++等的设定很类似.总体来说,有如下五种拼接方式,下面...
    99+
    2023-05-15
    Golang字符串拼接 Go 字符串拼接 Golang字符串
  • Golang中字符串拼接问题怎么解决
    本篇内容主要讲解“Golang中字符串拼接问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang中字符串拼接问题怎么解决”吧!1.概述Go的字符串是一个不可改变的数据结构,这和其...
    99+
    2023-07-06
  • mybatis中的字符串拼接问题
    目录mybatis字符串拼接使用CONCAT 函数使用${ } 代替 #{ }mybatis 拼接动态表名、字段名总结mybatis字符串拼接 MyBatis中拼接字符串有两种方式。...
    99+
    2023-02-07
    mybatis字符串拼接 mybatis拼接字符串 mybatis字符串
  • C++中常见的字符串拼接问题详解
    C++中常见的字符串拼接问题详解,需要具体代码示例在C++编程中,字符串拼接是一项常见的任务。无论是简单的拼接几个字符串还是复杂的字符串操作,都需要掌握一些基本的技巧和方法。本文将详细介绍C++中常见的字符串拼接问题,并提供具体的代码示例。...
    99+
    2023-10-22
    字符串拼接 C++ 中的字符串操作 字符串拼接问题详解
  • Java中list.foreach不能使用字符串拼接的问题
    目录list.foreach不能使用字符串拼接如图,不能使用String进行拼接foreach循环中不能使用字符串拼接问题解决原理   lambda表达式使用...
    99+
    2022-11-12
  • JS中循环字符串拼接时加换行问题
    目录JS循环字符串拼接时加换行JS字符串中的空格、换行符(\r,\s,\n,\r\n)换行,回车空白符总结JS循环字符串拼接时加换行 var importantItemsStr = ...
    99+
    2023-02-13
    JS循环字符串 JS字符串拼接 JS字符串换行
  • Golang语言怎么高效拼接字符串
    这篇文章主要介绍了Golang语言怎么高效拼接字符串,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。01、介绍在编程语言中,字符串是一种重要的数据结构。在 Golang 语言中...
    99+
    2023-06-25
  • SQL中字符串拼接的示例分析
    这篇文章主要为大家展示了“SQL中字符串拼接的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL中字符串拼接的示例分析”这篇文章吧。一、概述相信大家在...
    99+
    2022-10-18
  • C++中常见的字符串拼接问题解决方案
    C++中常见的字符串拼接问题解决方案在C++编程中,字符串拼接是一种常见的操作,特别是在处理文本和输出结果时。本文将介绍一些常见的字符串拼接问题,并提供相应的解决方案,同时附上代码示例以帮助读者理解。使用"+"运算符进行字符串拼接在C++中...
    99+
    2023-10-22
    字符串 解决 拼接 字符串拼接方案:
  • Java字符串拼接的示例分析
    这篇文章主要介绍了Java字符串拼接的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。背景字符串拼接不管是在业务上,还是写算法时都会频繁使用到。对于Java来说,字符串...
    99+
    2023-06-20
  • GoLang中拼接字符串性能优化方法详解
    字符串在内存中是不可变的,放在只读内存段,因此你可以使用str[0]来访问,但是不能使用str[0]='a'来修改。 修改字符串实际上是重新放入新的地址,因此拼接字符...
    99+
    2023-02-03
    GoLang拼接字符串 GoLang拼接字符串性能优化
  • C++中常见的字符串拼接问题的解决方案
    C++中常见的字符串拼接问题的解决方案在C++编程中,字符串拼接是一个常见的操作,通常用于拼接两个或多个字符串,或者将其他数据类型转换为字符串后进行拼接。在处理字符串拼接的过程中,我们需要考虑到性能和代码的简洁性。本文将介绍几种常见的字符串...
    99+
    2023-10-22
    C++ 问题解决方案 关键词:字符串拼接
  • python中如何拼接字符串
    在Python中,可以使用"+"运算符或者使用字符串的join()方法来拼接字符串。下面是两种方法的示例:1. 使用"+"运算符拼接...
    99+
    2023-08-11
    python
  • Golang语言如何高效拼接字符串详解
    目录01、介绍02、操作符 +03、strings.Join 方法04、fmt.Sprint 方法05、bytes.Buffer 类型06、strings.Builder 类型07、...
    99+
    2022-11-12
  • Mybatis-plusforeach拼接字符串查询无数据返回问题
    目录foreach拼接字符串查询无数据返回两种解决方式精讲#{}和${}的区别是什么?对于这个问题我感觉要抓住两点foreach拼接字符串查询无数据返回 Mybatis-plus x...
    99+
    2022-11-13
  • mysql中如何给查出的字符串拼接字符串
    mysql中查询字符串并实现字符串的方法首先,在命令行中启动MySQL服务;service mysql start   MySQL服务启动后,输入用户名和密码,登录mysql数据库;mysql -u root -p登录到MySQL数据库后,...
    99+
    2022-10-21
  • golang字符串转Time类型问题
    最近在做项目中,遇到了golang 字符串转Time类型的问题。调研后发现golang 提供了俩种方式,即time.Parse 跟 time.ParseInLocation。俩种方式...
    99+
    2023-05-16
    golang字符串转Time类型 golang 字符串 Time类型
  • php中字符串不能拼接吗
    php中字符串能进行拼接。字符串拼接的两种方法:1、使用字符串连接符“.”进行拼接,可以把两个或两个以上的字符串拼接成一个新的字符串,语法“$string1.$string2.$string3....”;2、使用赋值运算符“.=”进行拼接,...
    99+
    2022-08-15
    php php字符串
  • 怎么在Shell中拼接字符串
    怎么在Shell中拼接字符串?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 字符串声明概述字符串的基本操作脚本 1# 声明字符串str01="str...
    99+
    2023-06-09
  • SpringMVC+Ajax+拼接html字符串的示例分析
    这篇文章将为大家详细讲解有关SpringMVC+Ajax+拼接html字符串的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SpringMVC的简单增删改查(SS...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作