文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Golang字符串类型为什么不能修改

2023-07-04 15:02

关注

这篇“Golang字符串类型为什么不能修改”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang字符串类型为什么不能修改”文章吧。

字符串定义

字符串是一种用来表示字符的数据类型。在使用时,使用” “将字符内容包含起来。例如下面的形式:

package mainimport "fmt"func main() {    var str string = "Hello World!"}

在 Go 中,字符串通常有三种定义方式:

// 第一种(全量定义)var 变量名称 string = "字符串内容"// 类型推导var 变量名称 = "字符串内容"// 短标记(只适用于局部变量)变量名称 := "字符串内容"

字符串的定义,其实也可以通过字节的方式。这里罗列的方式是最为常见的方式。

字符串的组成

Go 中的字符串符合 Unicode 标准,并且采用 UTF-8 编码。字符串底层其实也是由 byte 组成 (后面会仔细讲解)。通过下面的示例,打印查看具体的字节内容:

s := "Hello World!"for _, v := range s {    fmt.Print(v)    fmt.Print("\t")}// 72 101 108 108 111 32 87 111 114 108 100 33

上面代码打印的内容,就是每一个字符所表示的字节码。

字符串不能修改

通过上面的大致演示,我们对字符串有一个基本的了解。对于字符串不能修改,可能你很纳闷,日常开发中我们对字符串进行重新赋值也是很正常的,为什么又说 Go 中的字符串不能进行修改呢?

其实这里要纠正这个说话,对于字符串修改并不等价于重新赋值。开发中常用的方式,其实是一种重新赋值的概念。

str := "Hello World!"// 重新赋值str = "Hello Go!"// 字符串修改str[0] = "I"

通常听到的不能修改,其实就是指的上面代码的第二种方式。并且通过这种方式修改会报错::cannot assign to s [0] (value of type byte)

回归正题,为什么 Go 中的字符串不能通过下标的方式来进行修改呢?

这是因为 Go中的字符串的数据结构体是由一个指针和长度组成的结构体,该指针指向的一个切片才是真正的字符串值。Go 中源码有这样一段定义:

type stringStruct struct {    str unsafe.Pointer // 指向一个byte类型的切片指针    len int // 字符串的长度}

Golang字符串类型为什么不能修改

正是因为底层是一个 [] byte 类型的切片,当我们使用下标的方式去修改值,这时候将一个字符内容赋值给 byte 类型,肯定是不允许的。但是我们可以通过下标的方式去访问对应的 byte 值。

fmt.Println(s[0]) // output:72

那我们要想通过下标的方式去修改值该怎么办呢?这时候,就需要通过切片的方式来定义,然后在转成字符串。

package mainimport (      "fmt")func main() {       s1 := []byte{72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33}    fmt.Println(string(s1))    // 将"H"修改为l    s1[0] = 108    fmt.Println(string(s1))}// output:Hello World!lello World!

字符串的赋值

上面分析了为什么字符串不能使用下标去赋值,回过来解答一下日常开发中的赋值方式。

package mainimport (      "fmt")func main() {    // 声明一个字符串,并给与初始值    s := "Hello World!"    // 对变量 s 进行重新赋值    s := "Hello Go!"}

那为什么这种场景下又可以给字符串重新赋值呢?

这是因为,在 Go 的底层其实是新创建了一个 [] byte {} 类型的切片,将变量 s 中的指针指向了新的内存空间地址 (也就是这里的 Hello Go!)。原有的 Hello World! 内存空间会随着垃圾回收机制被回收掉。

Golang字符串类型为什么不能修改

为什么这么设计

可能大家都会考虑到,为什么一个普通的字符串要设计这么复杂,还需要使用指针。暂时没找到官方文档的说明,

个人猜想,当遇到一个非常长的字符时,这样做使得 string 变得非常轻量,可以很方便的进行传递而不用担心内存拷贝。虽然在 Go 中,不管是引用类型还是值类型参数传递都是值传递。但指针明显比值传递更节省内存。

以上就是关于“Golang字符串类型为什么不能修改”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯