Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >go 字符串

go 字符串

原创
作者头像
Michel_Rolle
修改于 2023-11-12 00:12:20
修改于 2023-11-12 00:12:20
3.1K0
举报
文章被收录于专栏:LeetCode解题LeetCode解题

修改字符串

要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。

代码语言:go
AI代码解释
复制
func changeString() {

        s1 := "hello"

        // 强制类型转换

        byteS1 := []byte(s1)

        byteS1[0] = 'H'

        fmt.Println(string(byteS1))

        s2 := "博客"

        runeS2 := []rune(s2)

        runeS2[0] = '狗'

        fmt.Println(string(runeS2))

    }
  1. 先将这段内存拷贝到堆或者栈上;
  2. 将变量的类型转换成 []byte 后并修改字节数据;
  3. 将修改后的字节数组转换回 string
代码语言:go
AI代码解释
复制
// string is the set of all strings of 8-bit bytes, conventionally but not

// necessarily representing UTF-8-encoded text. A string may be empty, but

// not nil. Values of string type are immutable.

type string string

string是8位字节的集合,通常但不一定代表UTF-8编码的文本。string可以为空,但不能为nil。**string的值是不能改变的**

Go源代码为 UTF-8 编码格式的,源代码中的字符串直接量是 UTF-8 文本。所以Go语言中字符串是UTF-8编码格式的。

代码语言:go
AI代码解释
复制
// rune is an alias for int32 and is equivalent to int32 in all ways. It is

// used, by convention, to distinguish character values from integer values.

type rune = int32

rune是int32的别名,在所有方面都等同于int32,按照约定,它用于区分字符值和整数值。

rune一个值代表的就是一个Unicode字符,因为一个Go语言中字符串编码为UTF-8,使用1-4字节就可以表示一个字符,所以使用int32类型范围可以完美适配。

见坑

字符串拼接

优先使用 strings.Builder 而不是 +=

子字符串操作及内存泄露

字符串的切分也会跟切片的切分一样,可能会造成内存泄露。例子:有一个handleLog的函数,接收一个string类型的参数log,假设log的前4个字节存储的是log的message类型值,需要从log中提取出message类型,并存储到内存中。下面是相关代码:

代码语言:txt
AI代码解释
复制
func (s store) handleLog(log string) error {

    if len(log) < 4 {

        return errors.New("log is not correctly formatted")

    }

    message := log[:4]

    s.store(message)

    // Do something

}

使用log:4的方式提取出了message,假设参数log是一个包含成千上万个字符的字符串。当使用log:4操作时,实际上是返回了一个字节切片,该切片的长度是4,而容量则是log字符串的整体长度。那么实际上存储的message不是包含4个字节的空间,而是整个log字符串长度的空间。所以就有可能会造成内存泄露。如下图所示:

那怎么避免呢?使用拷贝。将uuid提取后拷贝到一个字节切片中,这时该字节切片的长度和容量都是4。如下:

代码语言:go
AI代码解释
复制
func (s store) handleLog(log string) error {

  if len(log) < 4 {

    return errors.New("log is not correctly formatted")

  }

  

  message := string([]byte(log[:4])) 

  s.store(message)

  // Do something

}

字符串的长度

内建的 len()函数返回byte的数量,而不是像Python中计算好的unicode字符串中字符的数量。

要在Go中得到相同的结果,可以使用“unicode/utf8”包中的 RuneCountInString()函数。

代码语言:go
AI代码解释
复制
package main



import("fmt""unicode/utf8")



func main(){  

    data :="♥"

    fmt.Println(utf8.RuneCountInString(data))//prints: 1}

理论上说 RuneCountInString()函数并不返回字符的数量,因为单个字符可能占用多个rune。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go字符串 【Go语言圣经笔记】
一个字符串是一个不可改变的字节序列(笔者注:修改一个字符串会产生新的字符串)。字符串可以包含任意的数据,包括byte值0,但是通常是用来包含人类可读的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列,我们稍后会详细讨论这个问题。
Steve Wang
2021/12/06
4680
Go程序例子(18):字符串与“字符”
Go 字符串是一个只读的字节切片。Go 语言及其标准库将字符串特殊处理——它们被视为以 UTF-8 编码的文本容器。在其他语言中,字符串由“字符”组成。而在 Go 中,“字符”的概念被称为 rune,它是表示 Unicode 代码点的整数。这篇 Go 官方博客文章是一个很好的入门资源。
用户11078756
2024/12/13
850
Go程序例子(18):字符串与“字符”
Go语言中常见100问题-#41 substrings and memory leaks
在Go语言中常见100问题-#26 slices and memory leaks讨论切片可能导致的内存泄露问题,其实对于字符串也可能会导致内存泄露。下面来分析在操作字符串的时候如何防止内存泄露。
数据小冰
2023/08/17
2190
Go语言中常见100问题-#41 substrings and memory leaks
字符串
注意 len是按照字节取值的,一个中文字占三个字节,所以这里得到的值是6 ,如果我们想按照字符取值的话,用这个方法就麻烦了,那怎么才能解决这个问题呢?
酷走天涯
2019/06/11
5380
字符串
聊聊 Go 语言中的字符表示与字符串遍历
为什么说字符只是整数的特殊用例呢?因为在 Go 中,用于表示字符的 byte 和 rune 类型都是整型的别名。在 Go 的源码中我们可以看到:
江不知
2019/12/12
9850
【转】Go语言---strings包(字符串操作)
字符串求长度 求子串 是否存在某个字符或者子串 子串出现的次数(字符串匹配) 字符串分割(切分)成[]string 字符串是否存在某个前缀或后缀 字符或者子串在字符串中首次出现的位置或最后一次出现的位置 通过某个字符串将[]string进行拼接 字符串重复次数 字符串中子串替换 大小写转换 ......................等等一些基本操作。 由于string类型可以看成是一种特殊的slice类型,因此获取长度可以用内置的函数len;同时支持 切片 操作,因此,子串获取很容易。
yiduwangkai
2019/09/17
1K0
Go错误集锦 | 字符串底层原理及常见错误
string是Go语言的基础类型,在实际项目中针对字符串的各种操作使用频率也较高。本文就介绍一下在使用string时容易犯的一些错误以及如何避免。
Go学堂
2023/01/31
4060
Go基础之--数组和切片
数组 数组的定义: 数组是具有固定长度并拥有零个或者多个相同数据类型元素的序列 定义一个数组的方法: var 变量名[len] type 例子: var a[5] int //3个整数的数组 var
coders
2018/01/04
8010
Go基础之--数组和切片
有趣的面试题:Go语言字符串的字节长度和字符个数
其实这并不是一道面试题,是我在日常开发中遇到的一个问题,当时场景是这样的:后端要对前端传来的字符串做字符校验,产品的需求是限制为200字符,然后我在后端做校验时直接使用len(str) > 200来做判断,结果出现了bug,前端字符校验没有超过200字符,调用后端接口确一直是参数错误,改成使用len([]rune(str)) > 200成功解决了这个问题。具体原因我们在文中揭晓。
Golang梦工厂
2022/07/08
6410
有趣的面试题:Go语言字符串的字节长度和字符个数
字节bytes的操作大全
两个切片,从下标0的位置,以此进行比较,如果值相等,则进行后面的值比较,直到数据不相等,如果值a > 值b 则返回 1, a == b 返回 0,否则返回-1
酷走天涯
2019/05/26
4970
【愚公系列】2022年7月 Go教学课程 011-字符串类型
在 Go 语言中,字符串是一个不可改变的字节序列,类型为原生数据类型,同 int 、bool、float32、float64 是一样的,字符串的值通过双引号来包裹字符。
愚公搬代码
2022/08/01
2200
【愚公系列】2022年7月 Go教学课程 011-字符串类型
Go语言中字符串的计算方式
name[1]对应的值是h ,h对应的值是104,有同学要说了,这不就证明"Go语言中字符串第i项是第i个字符"吗? 莫着急,我们接着看下面的一个案例:
似水流年o
2021/12/27
1.1K0
Go语言知识查漏补缺|基本数据类型
学习Go半年之后,我决定重新开始阅读《The Go Programing Language》,对书中涉及重点进行全面讲解,这是Go语言知识查漏补缺系列的文章第二篇,前一篇文章则对应书中一二两章。
白泽z
2022/12/20
5540
Go语言知识查漏补缺|基本数据类型
Go语言中常用的基本数据类型
Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true(真)和false(假)两个值。
极客运维圈
2020/03/23
1.3K0
Go 开发常用操作技巧--字符串
Go 语言字符串的字节使用的是UTF-8编码,是一种变长的编码方式。使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
微客鸟窝
2023/01/09
4770
Go 开发常用操作技巧--字符串
【Golang】深究字符串——从byte rune string到Unicode与UTF-8
Go语言使用UTF-8编码,因此任何字符都可以用Unicode表示。为此,Go在代码中引入了一个新术语,称为 rune。rune是int32的类型别名:
DDGarfield
2022/06/23
2.8K0
Go语言基础之基本数据类型
整型分为以下两个大类: 按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64 其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。
twelvecoder
2021/12/24
5800
go语言学习-数据类型
go语言有13种整形,其中有2种只是名字不同,实质是一样的,所以,实质上go语言有11种整形。如下:
solate
2019/07/22
6210
Go语言之父带你重新认识字符串、字节、rune和字符
文章篇幅还是挺长的,大家时间都很宝贵所以我先把文章探究的问题的结论放在前面,有时间的同学还是建议整篇读一下。
KevinYan
2020/02/18
1K0
区块链开发之Go语言—字符串和字节
字符串与字节的关系 Go 代码使用 UTF-8 编码,字符串和字节之间的转换依据的是UTF-8编码。注意中文是3个字节对应一个中文的字符串。 下面将归类讲述负责操作字符串和字节的几个标准库 strings 包提供了很多操作字符串的简单函数,通常一般的字符串操作需求都可以在这个包中找到。 bytes 包提供了对应操作字节的函数。 strconv 包提供了基本数据类型和字符串之间的转换。这个包之所以存在,是因为在Go中,没有隐式类型转换。字符串类型和 int、float、bool 等类型之间的转换却没有这么简单
linxinzhe
2018/04/10
1.4K0
相关推荐
Go字符串 【Go语言圣经笔记】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档