1. 字符串的底层实现原理

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "strconv"
  6. "unicode/utf8"
  7. )
  8.  
  9. func main() {
  10. // 计算机中所有的操作和数据最终都是二进制
  11. // go语言中的字符串是utf-8编码的序列
  12. // 字符串本质上是utf-8编码的序列
  13. name := "马馨彤"
  14.  
  15. // 马 => 11101001 10101001 10101100
  16. fmt.Println(name[0], strconv.FormatInt(int64(name[0]), 2))
  17. fmt.Println(name[1], strconv.FormatInt(int64(name[1]), 2))
  18. fmt.Println(name[2], strconv.FormatInt(int64(name[2]), 2))
  19.  
  20. // 馨 => 11101001 10100110 10101000
  21. fmt.Println(name[3], strconv.FormatInt(int64(name[3]), 2))
  22. fmt.Println(name[4], strconv.FormatInt(int64(name[4]), 2))
  23. fmt.Println(name[5], strconv.FormatInt(int64(name[5]), 2))
  24.  
  25. // 彤 => 11100101 10111101 10100100
  26. fmt.Println(name[6], strconv.FormatInt(int64(name[6]), 2))
  27. fmt.Println(name[7], strconv.FormatInt(int64(name[7]), 2))
  28. fmt.Println(name[8], strconv.FormatInt(int64(name[8]), 2))
  29.  
  30. // 2. 获取字符串的长度=9,utf-8编码的字节长度
  31. fmt.Println(len(name)) // len获取的是字节长度
  32.  
  33. // 3. 字符串转换为一个字节的切片
  34. byteSets := []byte(name) // [233 169 172 233 166 168 229 189 164]
  35. fmt.Println(byteSets)
  36.  
  37. // 4. 字节的切片转换为字符串
  38. byteList := []byte{233, 169, 172, 233, 166, 168, 229, 189, 164}
  39. targetString := string(byteList)
  40. fmt.Println(targetString)
  41.  
  42. // 5. 将一个字符串转换为 unicode字符集码点的切片 (rune) 9a6c => 马 99a8 => 馨 5f64 => 彤
  43. // rune使用的是unicode中的ucs4
  44. byteRune := []rune(name)
  45. fmt.Println(byteRune) // [39532 39336 24420]
  46. fmt.Println(byteRune[0], strconv.FormatInt(int64(byteRune[0]), 16))
  47. fmt.Println(byteRune[1], strconv.FormatInt(int64(byteRune[1]), 16))
  48. fmt.Println(byteRune[2], strconv.FormatInt(int64(byteRune[2]), 16))
  49.  
  50. // rune切片转换为字符串
  51. runeList := []rune{39532, 39336, 24420}
  52. target2String := string(runeList)
  53. fmt.Println(string(target2String))
  54.  
  55. // 字符长度
  56. runeLength := utf8.RuneCountInString(name) // 根据字符串统计字符长度
  57. two := utf8.RuneCount(byteList) // 根据字节切片统计字符长度
  58. fmt.Println(runeLength)
  59. fmt.Println(two)
  60.  
  61. }

  2. 常见15个功能

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "reflect"
  6. "strconv"
  7. "strings"
  8. "unicode/utf8"
  9. )
  10.  
  11. func main() {
  12. var name = "武沛齐"
  13. var name2 = "WuPeiQi"
  14. var name3 = " wupeiqiqi "
  15. var name4 = "抬老子的意大利的炮来"
  16.  
  17. // 1. 获取字符串的长度
  18. fmt.Println(len(name)) // 字节长度
  19. fmt.Println(utf8.RuneCountInString(name)) // 字符长度
  20.  
  21. // 2. 是否以xx开头
  22. ret1 := strings.HasPrefix(name, "武")
  23. fmt.Println(ret1)
  24.  
  25. // 3. 是否以xx结尾
  26. ret2 := strings.HasSuffix(name, "齐")
  27. fmt.Println(ret2)
  28.  
  29. // 4. 是否包含
  30. ret3 := strings.Contains(name, "沛")
  31. fmt.Println(ret3)
  32.  
  33. // 5. 变大写
  34. ret4 := strings.ToUpper(name2)
  35. fmt.Println(ret4)
  36.  
  37. // 5. 变小写
  38. ret5 := strings.ToLower(name2)
  39. fmt.Println(ret5)
  40.  
  41. // 6. 去两边
  42. ret6 := strings.Trim(name3, " ")
  43. ret7 := strings.TrimLeft(name3, " ")
  44. ret8 := strings.TrimRight(name3, " ")
  45. fmt.Println(ret6, ret7, ret8)
  46.  
  47. // 7. 替换,第三个参数代表从左到右替换1、2和所有
  48. ret9 := strings.Replace(name3, "i", "I", 1)
  49. ret10 := strings.Replace(name3, "i", "I", 2)
  50. ret11 := strings.Replace(name3, "i", "I", -1)
  51. fmt.Println(ret9, ret10, ret11)
  52.  
  53. // 8. 分割
  54. ret12 := strings.Split(name4, "的")
  55. fmt.Println(ret12)
  56.  
  57. // 9. 拼接1,不建议
  58. message := "我爱" + "北京天安门"
  59. fmt.Println(message)
  60.  
  61. // 10 拼接2,建议 效果高一些
  62. dataSlice := []string{"我爱", "北京天安门"}
  63. ret13 := strings.Join(dataSlice, "-")
  64. fmt.Println(ret13)
  65.  
  66. // 效率更高一些 go1.10之后
  67. var builder strings.Builder
  68. builder.WriteString("我爱-")
  69. builder.WriteString("北京天安门")
  70. value := builder.String()
  71. fmt.Println(value)
  72.  
  73. // 11. string 转换为 int类型
  74. num1 := "123465"
  75. ret14, _ := strconv.Atoi(num1) // 方法1 结果是int类型
  76. fmt.Println(ret14, reflect.TypeOf(ret14))
  77.  
  78. ret15, _ := strconv.ParseInt(num1, 10, 0) // 结果是int64类型
  79. fmt.Println(ret15, reflect.TypeOf(ret15))
  80.  
  81. // 12. int 转换为 string
  82. num2 := 789
  83. ret16 := strconv.Itoa(num2)
  84. fmt.Println(ret16, reflect.TypeOf(ret16))
  85.  
  86. ret17 := strconv.FormatInt(int64(num2), 10)
  87. fmt.Println(ret17, reflect.TypeOf(ret17))
  88.  
  89. // 13. 字符串和字节切片
  90. byteSlice := []byte(name) // 字符串转字节
  91. fmt.Println(byteSlice) // [230 173 166 230 178 155 233 189 144]
  92.  
  93. // 字节转字符串
  94. targetString := string(byteSlice)
  95. fmt.Println(targetString)
  96.  
  97. // 14. 字符串和rune切片
  98. runeSlice := []rune(name) // 字符串转rune切片
  99. fmt.Println(runeSlice)
  100.  
  101. // rune切片转字符串
  102. targetString2 := string(runeSlice)
  103. fmt.Println(targetString2)
  104.  
  105. // 15. string 和 字符
  106. // 根据码点找到对应的字符信息
  107. v1 := string(65) // 数字转字符
  108. fmt.Println(v1, reflect.TypeOf(v1)) // A string
  109. // 字符串转rune数字和字节长度
  110. v2, size := utf8.DecodeRuneInString("武")
  111. fmt.Println(v2, size)
  112.  
  113. // 应用场景:生成一个随机数,然后调用string得到一个随机字符
  114. }

  3. 字符串索引切片和循环

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func main() {
  6. var name = "a武沛齐"
  7. // 1. 索引获取字节
  8. ret1 := name[0]
  9. fmt.Println(ret1)
  10. // 2. 切片获取字节区间
  11. ret2 := name[:3]
  12. fmt.Println(ret2)
  13. // 3. 手动循环获取所有字节
  14. for i := 0; i < len(name); i++ {
  15. fmt.Println(i, name[i])
  16. }
  17. // 4. for range 循环获取所有字符
  18. for index, item := range name {
  19. fmt.Println(index, item, string(item))
  20. }
  21. // 5. 转换成rune切片
  22. runeSlice := []rune(name)
  23. fmt.Println(runeSlice) // [97 27494 27803 40784]
  24. fmt.Println(runeSlice[0], string(runeSlice[0]))
  25. fmt.Println(runeSlice[1], string(runeSlice[1]))
  26. }

  

golang中字符串的底层实现原理和常见功能的更多相关文章

  1. golang中发送http请求的几种常见情况

    整理一下golang中各种http的发送方式 方式一 使用http.Newrequest 先生成http.client -> 再生成 http.request -> 之后提交请求:clie ...

  2. golang中字符串内置函数整理

    字符串内置函数 1. 判断字符串的长度 str := "korea国" fmt.Println("str len=", len(str)) 2. 字符串遍历,同 ...

  3. golang中字符串的查找方法小结

    1)func Contains(s, substr string) bool这个函数是查找某个字符是否在这个字符串中存在,存在返回true 示例如下: import ( "fmt" ...

  4. golang中字符串、数值、2进制、8进制、16进制、10进制、日期和字符串之间的转换

    package main import ( "fmt" "reflect" "strconv" "time" ) fun ...

  5. golang中字符串、bytes类型切片、16进制字符串之间的转换

    func main() { // 字符串转bytes类型 name := "马亚南" fmt.Println(name) // 马亚南 bName := []byte(name) ...

  6. golang中字符串-字节切片,字符串-字符切片的互转

    package main import ( "fmt" "reflect" ) func B2S(bs []uint8) string { // 将字节切片转换 ...

  7. Golang 入门 : 字符串

    在 Golang 中,字符串是一种基本类型,这一点和 C 语言不同.C 语言没有原生的字符串类型,而是使用字符数组来表示字符串,并以字符指针来传递字符串.Golang 中的字符串是一个不可改变的 UT ...

  8. golang 中string和int类型相互转换

    总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: int, err := strconv.Atoi(string)string转成int64: int64, e ...

  9. 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等

    redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...

随机推荐

  1. JAVA生成订单编号工具类

    JAVA根据时间戳和随机数方式生成订单编号工具类 OrderUtils.java package com.util; import java.text.DateFormat; import java. ...

  2. 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告

    [LeetCode]106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告(Python) 标签: LeetCode ...

  3. Primitive Roots(poj1284)

    Primitive Roots Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3928   Accepted: 2342 D ...

  4. 洛谷 P1434 [SHOI2002]滑雪(DP,记忆化搜索)

    题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...

  5. 基于Spring MVC + Spring + MyBatis的【图书信息管理系统(二)】

    资源下载:https://download.csdn.net/download/weixin_44893902/35123371 练习点设计:添加.删除.修改 一.语言和环境 实现语言:JAVA语言. ...

  6. Java工程编码格式由GBK转化成utf-8(编码格式互转)

    在写项目的过程中我发现有的地方编码格式被设置成了 gbk 如果用eclipse等工具直接改回utf-8编码格式则会出现乱码. 下载:https://download.csdn.net/download ...

  7. 4.1.4 统计“锦途网”旅游线路平均价格,并采用尽可能多的方式将该价格赋给用户会话变量 @avg_short_price,并输出该变量

    查看本章节 查看作业目录 需求说明: 统计"锦途网"旅游线路平均价格,并采用尽可能多的方式将该价格赋给用户会话变量 @avg_short_price,并输出该变量 在 MySQL ...

  8. maven dependency全局排除

    http://www.voidcn.com/article/p-zychsdnd-bqg.html 个人比较喜欢log4j.properties这种配置文件,而springboot默认使用logbac ...

  9. Hadoop Jobhistory配置启用

    Hadoop Jobhistory记录下已运行完的MapReduce作业信息并存放在指定的HDFS目录下, 默认情况下是没有启动的,需要配置完后手工启动服务. 1.修改hadoop的配置文件mapre ...

  10. [学习笔记] RabbitMQ的安装使用

    安装 使用命令行安装,会自动管理依赖(推荐): choco install rabbitmq 安装包安装: 以管理员身份安装64位的 Erlang. 下载并安装 RabbitMQ 服务.下载地址. R ...