Golang系列之字符串类型基本介绍

x33g5p2x  于2022-02-07 转载在 Go  
字(2.3k)|赞(0)|评价(0)|浏览(433)

Golang系列之字符串类型基本介绍

1、基本介绍

在go语言中,字符串是一种基本类型,和其它开发语言不同,go的字符串是由单个字节连接起来的。go语言统一使用utf-8编码标识Unicode文本。当字符为ASCII编码时,占用1个字节,其它字符占用2到4个字节,中文占用3个字节
补充,这里读者可能会有疑问,ASCII 、Unicode、UTF-8有什么关系?
ASCII:编码包含了 33 个控制字符和 95 个可显示字符,不支持中文字符
Unicode:是一个更大范围的编码表集合,比ASCII更广,囊括了目前世界上所有语言的所有字符
UTF-8:有别于ASCII、Unicode,UTF-8是Unicode编码的实现方式之一,会将 Unicode 字符以某种方式进行编码
详细的可以参考阮一峰大佬的博客:字符编码笔记:ASCII,Unicode 和 UTF-8

golang字符串:

  1. // 定义string变量
  2. var str string
  3. str = "golang"
  4. // 赋值声明变量str1
  5. str1 := "golang"
  6. // 打印字符串和对应字符长度
  7. fmt.Printf("%s length is %d \n" , str , len(str))

2、字符不可变值

go中的string字符串值,是不可以改变对应的字符值的,但是整个字符串可以更改

  1. var str string = "golang"
  2. str = "test"
  3. // 编译报错,cannot assign to str[0]
  4. // str[0] = 's'

3、字符串表示形式

  1. 双引号,常规方式,会识别转义字符
  2. 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以防止网络攻击
  1. // 使用反引号
  2. res := `programming language :
  3. Java
  4. Golang
  5. Python
  6. PHP
  7. ...
  8. `
  9. // 双引号也可以实现类似效果,需要加上转义字符等等
  10. res1 := "programming language :\n" +
  11. "Java\n" +
  12. "Golang\n" +
  13. "Python\n" +
  14. "PHP\n" +
  15. "...\n"
  16. fmt.Printf("%s" , res)
  17. fmt.Printf("%s" , res1)

常用的转义字符:

  • \t:制表符,通常用于排版
  • \n:换行符
  • \\:反斜杆自身
  • \":一个"
  • \r:一个回车
  • \u 或 \U :Unicode 字符

4、字符串操作

  • 字符串拼接
    字符串的拼接很简单,直接通过+号就行
  1. str := "golang"
  2. str = str + " learning"
  3. fmt.Printf("%s" , str)

这里有个注意事项,如果字符串太长,+必须加到上一行的后面,不能换行

  • 获取字符
    要获取字符串对应字符,可以通过下标,类似于str[1]直接获取,而不用将字符串类型转为数组类型,字符串获取对应区间的数据,遵循“左闭右开”的原则
  1. str := "golang,learning"
  2. // [0:6) 左闭右开区间
  3. str1 := str[:6]
  4. // 特殊情况,这里两边都是闭区间[7:len(str)]
  5. str2 := str[7:]
  6. // 注意,这里也是[0:6)
  7. str3 := str[0:6]
  8. fmt.Println("str1=" , str1 , "str2=" , str2 , "str3=", str3)
  • 遍历字符串
    遍历有两种方式,下面通过例子进行对比
  1. str := "golang learning(学习)"
  2. // 遍历字符串
  3. for i := 0 ; i <len(str) ; i++ {
  4. ch := str[i]
  5. fmt.Println( i , ch, string(ch))
  6. }

打印了之后,发现中文的都乱码了,为什么?提示一下,这种方式遍历使用的是字节遍历,前面的学习知道,go中字符串是由字节组成的,byte的取值范围是0~255

  1. 0 103 g
  2. 1 111 o
  3. 2 108 l
  4. 3 97 a
  5. 4 110 n
  6. 5 103 g
  7. 6 32
  8. 7 108 l
  9. 8 101 e
  10. 9 97 a
  11. 10 114 r
  12. 11 110 n
  13. 12 105 i
  14. 13 110 n
  15. 14 103 g
  16. 15 40 (
  17. 16 229 å
  18. 17 173 ­
  19. 18 166 ¦
  20. 19 228 ä
  21. 20 185 ¹
  22. 21 160
  23. 22 41 )

有看过我上一篇博客的读者,链接https://smilenicky.blog.csdn.net/article/details/122639280,可以知道中文对应的Unicode编码是超过255的,而且中文需要占用3个字节,byte只占用1个字节,所以是不能打印出中文字符的

所以,需要换种方法,使用range关键字,这种方法,使用了rune存储字符

  1. str := "golang learning(学习)"
  2. for i , ch := range str {
  3. fmt.Println( i , ch, string(ch))
  4. }

打印,中文也可以打印出来:

  1. 0 103 g
  2. 1 111 o
  3. 2 108 l
  4. 3 97 a
  5. 4 110 n
  6. 5 103 g
  7. 6 32
  8. 7 108 l
  9. 8 101 e
  10. 9 97 a
  11. 10 114 r
  12. 11 110 n
  13. 12 105 i
  14. 13 110 n
  15. 14 103 g
  16. 15 40 (
  17. 16 23398
  18. 19 20064
  19. 22 41 )

补充:

byte:代表 UTF-8 编码中单个字节的值,是 uint8 类型的别名,占用一个字节
rune:代表单个 Unicode 字符,是 int32 类型的别名,占用4个字节

相关文章

最新文章

更多