go字符串详解

这篇具有很好参考价值的文章主要介绍了go字符串详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


摘要

go字符串结构体包含:指向底层存储数组的指针、字符串长度。字符串按utf-8将字符编码成二进制数,然后存储在byte数组中。因为utf-8编码一个字符可能占用多个字节,例如一个汉字占3个字节,所以字符串中的一个字符可能对应byte数组中的多个元素。为了让一个字符对应数组的一个元素以便于处理,go设计了rune类型,其底层是int32,四个字节,正好能存储最大四个字节utf-8编码数据。

1、byte和rune类型

  • byte等价于uint8类型的数据,一个字节大小,是字符串底层存储数据的结构。
  • rune等价于int32类型的数据,四个字节大小,为了处理utf-8字符串而设计的。因为go语言字符串默认是按照utf-8编码的方式存储数据的,其中最大的字符占用4个字节的数据,所以需要rune才能一个字符对应一个数据元素。

2、字符串(string)

在go中字符串具有如下特征:

  • go字符串存储在只读内存段中,不能被修改,但可以被切片和复制。
  • 字符串结构由一个指向底层数组的指针和字符串长度组成。因为给出了具体长度,所以不需要以’\0’的方式判断字符串结尾。
  • 底层使用字节(byte)数组存储字符串中各字符对应的数字编码。一个字符可能占用好几个byte。

需要注意的是在utf-8编码中,一个汉字占用3个字节,而byte是uint8类型,一个byte元素一个字节,需要三个byte才能存储一个汉字。所以:

func main() {
   s := "哈喽世界"
   fmt.Println(len(s)) // 输出:12
}

而rune是int32类型,四个字节,和utf-8最大字节数(4个字节)一致,所以可以将string类型转换为rune,去查看其具体存储的字符数。如下:

func main() {
   s := "哈喽世界"
   fmt.Println(len([]rune(s))) // 输出:4
}

需要注意的是:go中rune类型就是为了处理utf-8字符串而设计的,而定长4字节的方式存储utf-8中只占1、2、3个字节的字符,存在一定的空间浪费。所以string默认是按照byte类型的存储的,更加节省空间,当需要的时候,再转换为rune处理。

3、练习-反转字符串

如果反转函数如下:

func reverse(s string) string {
   bs := []byte(s)
   sLen := len(bs)
   for i := 0; i < sLen/2; i++ {
      bs[i], bs[sLen-i-1] = bs[sLen-i-1], bs[i]
   }
   return string(bs)
}

那么传入属于1字节编码的ASCILL字符,能够被反转:

func main() {
   s := "abcdefg"
   fmt.Println(reverse(s)) // 输出gfedcba
}

但是若传入需要占用多个字节的字符,就会输出乱码:

s := "哈喽世界"
fmt.Println(reverse(s)) // 输出��疸佖刓�

所以如果想要使得所有输入字符都能被正确的反转,应该使用rune代替byte:文章来源地址https://www.toymoban.com/news/detail-493945.html

func reverse(s string) string {
   bs := []rune(s)
   sLen := len(bs)
   for i := 0; i < sLen/2; i++ {
      bs[i], bs[sLen-i-1] = bs[sLen-i-1], bs[i]
   }
   return string(bs)
}

func main() {
   s := "哈喽世界"
   fmt.Println(reverse(s)) // 输出:界世喽哈
}

到了这里,关于go字符串详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中判断字符串是否包含另一个字符串

    Python中判断字符串是否包含另一个字符串 在Python编程中,经常需要判断一个字符串是否包含另一个字符串。这在处理文本数据或搜索操作时非常常见。Python提供了几种方法来实现这个功能,本文将介绍其中的几种方法,并提供相应的源代码示例。 方法一:使用in 最简

    2024年02月07日
    浏览(57)
  • golang中如何判断字符串是否包含另一字符串

    golang中如何判断字符串是否包含另一字符串 在Go语言中,可以使用strings.Contains()函数来判断一个字符串是否包含另一个字符串。该函数接受两个参数:要搜索的字符串和要查找的子字符串,如果子字符串存在于要搜索的字符串中,则返回true,否则返回false。 下面是一个示例代

    2024年02月09日
    浏览(69)
  • Java判断一个字符串是否包含某个字符

    1 问题 如何利用Java通过不同的方法来判断一个字符串是否包含某个字符。 2 方法 .contains方法 这个是利用java.lang.String.contains() 方法返回true,当且仅当此字符串包含指定的char值序列,此方法返回true,如果此字符串包含,否则返回false。 (2).indexOf方法 这一个是利用java.lang.Str

    2024年02月16日
    浏览(91)
  • ChatGPT:字符串操作问题——提取包含括号的字符串中的题干内容

    String title = p.text().split(“(”)[0];为什么会报错 ChatGPT: 在这段代码中,您正在使用Java处理一个字符串(假设是HTML或文本),尝试将其分割成两部分,其中一个是从左括号\\\"(\\\"之前的内容。这段代码的目的是提取标题,但可能会出现一些错误,具体取决于输入字符串和代码的上

    2024年02月07日
    浏览(36)
  • Oracle-如何判断字符串包含中文字符串(汉字),删除中文内容及保留中文内容

    今天遇见一个问题需要将字段中包含中文字符串的筛选出来 在网上查找了一下有以下三种方式: length计算字符长度,lengthb计算字节长度 筛选出包含中文的字符串 ASCIISTR函数,参数是一个字符串,如果这个字符在ASCII码表中有,则转成ASCII表中的字符。如果没有,则转成xxx

    2024年02月12日
    浏览(57)
  • Linux :: 内容过滤指令【3】:grep 指令【详解】:在指定文件中过滤搜索信息、(模糊)查找包含指定字符串的内容!(如:系统故障时,查看操作日志信息等情景)

    前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C++ 入门到入土!!!学习合集 Linux 从命令到网络再到内核!学习合集 注:find 指令常与 grep 指令在面试中被提及,需让你回答异同! 目录索引: 1. 基本语法、功能及使

    2024年02月09日
    浏览(57)
  • c# 判断一个字符串列表是否包含另一个字符串列表中某一个元素

    当需要判断一个字符串列表是否包含另一个字符串列表中的某个元素时,可以使用 LINQ 查询来完成。下面是一个示例方法: 在上面的示例中,我们有两个字符串列表 list1 和 list2。我们想要判断 list1 是否包含了 list2 中的某个元素。 我们定义了 ListContainsElement 方法,该方法接

    2024年02月12日
    浏览(79)
  • 题目:2185.统计包含给定前缀的字符串

    ​​ 题目来源:         leetcode题目,网址:2185. 统计包含给定前缀的字符串 - 力扣(LeetCode) 解题思路:        遍历判断即可。 解题代码: 总结:         官方题解也是一样的思路。

    2024年02月15日
    浏览(58)
  • 【Java】日期/事件字符串包含TZ

    这个时间是什么格式? 2021-09-02T15:25:03Z jdk1.8 2021-09-02T15:25:03Z 中T是表示时间段开始的,Z是表示UTC时间(通用协调时, Universal Time Coordinated)。 UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时间相同。 包含T、Z的日期的出自 ISO 8601 Extended Format 。 I

    2023年04月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包