温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2023-03-06 10:55:57 来源:亿速云 阅读:82 作者:iii 栏目:开发技术

今天小编给大家分享一下Golang中的字符串类型为什么不能修改的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

字符串定义

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

package main

import "fmt"

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

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

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

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

字符串的组成

Go中的字符串符合Unicode[1]标准,并且采用UTF-8[2]编码。字符串底层其实也是由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 main

import (  
    "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 main

import (  
    "fmt"
)

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

那为什么这种场景下又可以给字符串重新赋值呢? 这是因为,在Go的底层其实是新创建了一个[]byte{}类型的切片,将变量s中的指针指向了新的内存空间地址(也就是这里的Hello Go!)。原有的Hello World!内存空间会随着垃圾回收机制被回收掉。

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

以上就是“Golang中的字符串类型为什么不能修改”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI