【golang学习之旅】深入理解字符串string数据类型

系列文章

【golang学习之旅】报错:a declared but not used
【golang学习之旅】Go 的基本数据类型



使用示例

Go 语言中的字符串只是一个只读的字节数组

Go中的字符串都是采用UTF-8字符集编码。

字符串是用一对双引号(“”)或反引号( )括起来定义,它的类型是string

示例:

var frenchHello string  // 声明变量为字符串的一般方法
var emptyString string = ""  // 声明了一个字符串变量,初始化为空字符串
func test() {
    no, yes, maybe := "no", "yes", "maybe"  // 简短声明,同时声明多个变量
    japaneseHello := "Konichiwa"  // 同上
    frenchHello = "Bonjour"  // 常规赋值
}

string的底层数据结构

Go语言字符串的底层数据结构是 reflect.StringHeader( reflect/value.go),它包含了指向字节数组的指针,以及该指针指向的字符数组的大小:

type StringHeader struct {
	Data uintptr
	Len  int
}

下图展示了 “hello” 字符串在内存中的存储方式:

在这里插入图片描述


关于字符串复制

当将一个字符串变量赋值给另外一个变量时候,他们 StringHeader.Data 都指向同一个内存地址,不会发生字符串拷贝:

a := "hello"
b := a

在这里插入图片描述


字符串是不可变的

例如下面的代码编译时会报错:cannot assign to s[0]

var s string = "hello"
s[0] = 'c'

但如果真的想要修改怎么办呢?下面的代码可以实现:

s := "hello"
c := []byte(s)  // 将字符串 s 转换为 []byte 类型
c[0] = 'c'
s2 := string(c)  // 再转换回 string 类型
fmt.Printf("%s\n", s2)

或者下面的代码:

s := "hello"
s = "c" + s[1:] // 字符串虽不能更改,但可进行切片操作
fmt.Printf("%s\n", s)

如何高效的进行字符串拼接?

参考:https://go.cyub.vip/type/string/

相关推荐

  1. 【Rust】字符串String类型学习

    2024-04-28 07:18:04       28 阅读
  2. Golang学习路一三基本数据类型

    2024-04-28 07:18:04       54 阅读
  3. 深入理解 Golang 中的值类型和引用类型

    2024-04-28 07:18:04       68 阅读
  4. Python字符串数据类型字符串

    2024-04-28 07:18:04       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-28 07:18:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-28 07:18:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-28 07:18:04       82 阅读
  4. Python语言-面向对象

    2024-04-28 07:18:04       91 阅读

热门阅读

  1. 介绍 TensorFlow 的基本概念和使用场景

    2024-04-28 07:18:04       178 阅读
  2. 五个衰落的编程语言

    2024-04-28 07:18:04       32 阅读
  3. Python基础12-爬虫抓取网页内容

    2024-04-28 07:18:04       66 阅读
  4. Python爬虫-车主之家详情页汽车数据

    2024-04-28 07:18:04       33 阅读
  5. (python)动态规划

    2024-04-28 07:18:04       77 阅读
  6. springBoot加载配置文件

    2024-04-28 07:18:04       127 阅读
  7. websocket集成文档

    2024-04-28 07:18:04       35 阅读
  8. 部署接入 M3E和chatglm2-m3e文本向量模型

    2024-04-28 07:18:04       31 阅读
  9. Docker容器配置进阶

    2024-04-28 07:18:04       184 阅读
  10. 数据结构——复杂度(时间,空间)

    2024-04-28 07:18:04       29 阅读
  11. 前端HTML如何不删除div标签将div标签隐藏

    2024-04-28 07:18:04       36 阅读