简单聊聊为什么说Go语言字符串是不可变的

 更新时间:2023年05月29日 15:22:01   作者:yongxinz  
最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢,本文就来和大家简单讲讲

最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?

这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。

首先来看看它的底层结构:

type stringStruct struct {
    str unsafe.Pointer
    len int
}

和切片的结构很像,只不过少了一个表示容量的 cap 字段。

  • str:指向一个 []byte 类型的指针
  • len:字符串的长度

所以,当我们定义一个字符串:

s := "Hello World"

那么它在内存中存储是这样的:

当我们在程序中对字符串进行重新赋值时,比如这样:

s := "Hello World"

s = "Hello AlwaysBeta"

底层的存储就变成了这样:

Go 实际上是重新创建了一个 []byte{} 切片,然后让指针指向了新的地址。

更直接一点,我们直接修改字符串中的单个字符,比如:

s := "Hello World"
s[0] = 'h'

这样做的话,会直接报错:

cannot assign to s[0] (strings are immutable)

如果一定要这么做的话,需要对字符串进行一个转换,转换成 []byte 类型,修改之后再转换回 string 类型:

s := "Hello World"
sBytes := []byte(s)
sBytes[0] = 'h'
s = string(sBytes)

这样就可以了。

到此这篇关于简单聊聊为什么说Go语言字符串是不可变的的文章就介绍到这了,更多相关Go语言字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言实现JSON解析的方法详解

    Go语言实现JSON解析的方法详解

    在日常项目中,使用Json格式进行数据封装是比较常见的操作。本文将详细讲解如何利用Go语言实现JSON的解析,感兴趣的小伙伴可以学习一下
    2022-04-04
  • Go语言高效I/O并发处理双缓冲和Exchanger模式实例探索

    Go语言高效I/O并发处理双缓冲和Exchanger模式实例探索

    这篇文章主要介绍了Go语言高效I/O并发处理双缓冲和Exchanger模式实例探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 使用go语言实现Redis持久化的示例代码

    使用go语言实现Redis持久化的示例代码

    redis 是一个内存数据库,如果你把进程杀掉,那么里面存储的数据都会消失,那么这篇文章就是来解决 redis 持久化的问题,本文给大家介绍了使用go语言实现Redis持久化,需要的朋友可以参考下
    2024-07-07
  • 使用go实现删除sql里面的注释和字符串功能(demo)

    使用go实现删除sql里面的注释和字符串功能(demo)

    这篇文章主要介绍了使用go实现删除sql里面的注释和字符串功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Golang标准库unsafe源码解读

    Golang标准库unsafe源码解读

    这篇文章主要为大家介绍了Golang标准库unsafe源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 从零开始学Golang的接口

    从零开始学Golang的接口

    本文主要介绍了从零开始学Golang的接口,原文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • GoFrame框架gredis优雅的取值和类型转换

    GoFrame框架gredis优雅的取值和类型转换

    这篇文章主要为大家介绍了GoFrame框架gredis优雅的取值和类型转换,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang定时器Timer与Ticker的使用详解

    Golang定时器Timer与Ticker的使用详解

    在 Go 里有很多种定时器的使用方法,像常规的 Timer、Ticker 对象,本文主要为大家介绍了Timer与Ticker的使用,感兴趣的小伙伴可以了解一下
    2023-05-05
  • Go语言中匿名嵌套和类型嵌套的区别解析

    Go语言中匿名嵌套和类型嵌套的区别解析

    在Go语言中,匿名嵌套结构体和与类型同名的嵌套结构体不是完全等价的,它们有一些重要的区别,这篇文章主要介绍了Go语言中匿名嵌套和类型嵌套的区别,需要的朋友可以参考下
    2023-09-09
  • Go语言中多字节字符的处理方法详解

    Go语言中多字节字符的处理方法详解

    这篇文章主要给大家介绍了关于Go语言中多字节字符的处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10

最新评论