实例演示:Golang字符串类型为什么不能修改

本文由翼速应用为大家实例分享Golang字符串类型为什么不能修改,在接触 Go语言的时候不知道大家有没有听说过,go字符串是不能修改的,那么为什么平时开发时的字符串可以修改,在GO中却不行呢?下面一起来看一下。


实例演示:Golang字符串类型为什么不能修改


实例演示:Golang字符串类型为什么不能修改


在 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 // 字符串的长度
}


GO源码图示


因为底层是一个 [] 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! 内存空间会随着垃圾回收机制被回收掉。


GO图示


在Golang中不能修改字符串类型的详细解析就到这里了,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题