go语言中的string类型简介

文章介绍了Go语言中字符串的特性,如不可变性,以及常用的字符串操作,如长度获取、拼接、截取和遍历。同时,讨论了字符串连接的性能问题,并提出了使用strings.Builder和strings.Join进行优化的方法,对比了它们的效率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Go 中,String 是一种不可变的类型,不能被修改。

在 Go 语言中,字符串由 Unicode 字符组成,每个字符都可以用一个或多个字节来表示。我们使用双引号或反引号来定义字符串,使用反引号定义的字符串不会对其内容进行任何的转义(例如文本中包含 \n时并不会进行转义)

s1 := "hello, world\n"
fmt.Print(s1)

// 使用反引号定义的原生字符串
s2 := `hello, world\n`
fmt.Print(s2)

// 使用反斜杠进行转义
s3 := "C:\\Windows\\System32\\"
fmt.Print(s3)

常见的字符串操作有:

  1. 获取长度:内置函数 len()
  2. 拼接:加号运算符 +fmt.Sprintf() 格式化
  3. 截取:切片操作
  4. 遍历:for 循环与 range 关键字
  5. 比较:比较运算符 ==、!=、<、<=、>、>=

以下是一个示例代码,演示了如何在 Go 语言中定义和使用字符串类型:

var str1 string = "Hello"
var str2 string = "world"
// 获取长度
fmt.Println(len(str1))
// 拼接
var str3 string = str1 + " " + str2
// 截取
fmt.Printf("str3[1:4]: %s\n", str3[1:4])
// 遍历
for index, char := range str3 {
 fmt.Printf("str3[%d]: %c\n", index, char)
}
// 比较
if str1 == "Hello" {
 fmt.Println("str1 equals Hello")
}

字符串连接性能优化:

在 Go 和 Java 中,字符串在内存中都被当作常量处理。因此,不断使用 “+” 符号拼接字符串会产生大量性能开销。针对此,我们有一些优化字符串连接的策略:

  1. 使用 strings.Builder 类型:这种方法适用于你没有提前准备好所有需要拼接的字符串的情况。

  2. 使用 strings.Join() 函数:这种方法适用于你已经准备好所有需要拼接的字符串的情况,且允许我们在拼接的字符串中插入分隔符,这在某些情况下是必需的。但是这种方法会消耗大量内存。

// 输出:11-22
join := strings.Join( []string{"11", "22"}, "-" )

以下是对这两种方法的应用示例:

// strings.Builder
start := time.Now()
var name strings.Builder
for i := 0; i < 100000; i++ {
	name.WriteString(strconv.Itoa(i))
}
fmt.Println(time.Since(start))
// strings.Join()
start := time.Now()
var strs []string
for i := 0; i < 100000; i++ {
	strs = append(strs, strconv.Itoa(i))
}
name := strings.Join(strs, "")
fmt.Println(time.Since(start))
fmt.Println(len(name))

在一些实验中,我们得到了以下结果:

  1. 原生形式:平均 1.3 秒
  2. strings.Builder :平均 2.3 毫秒
  3. strings.Join() :平均 4.8 毫秒
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThinkStu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值