golang中字符串的底层实现原理和常见功能
1. 字符串的底层实现原理
- package main
- import (
- "fmt"
- "strconv"
- "unicode/utf8"
- )
- func main() {
- // 计算机中所有的操作和数据最终都是二进制
- // go语言中的字符串是utf-8编码的序列
- // 字符串本质上是utf-8编码的序列
- name := "马馨彤"
- // 马 => 11101001 10101001 10101100
- fmt.Println(name[0], strconv.FormatInt(int64(name[0]), 2))
- fmt.Println(name[1], strconv.FormatInt(int64(name[1]), 2))
- fmt.Println(name[2], strconv.FormatInt(int64(name[2]), 2))
- // 馨 => 11101001 10100110 10101000
- fmt.Println(name[3], strconv.FormatInt(int64(name[3]), 2))
- fmt.Println(name[4], strconv.FormatInt(int64(name[4]), 2))
- fmt.Println(name[5], strconv.FormatInt(int64(name[5]), 2))
- // 彤 => 11100101 10111101 10100100
- fmt.Println(name[6], strconv.FormatInt(int64(name[6]), 2))
- fmt.Println(name[7], strconv.FormatInt(int64(name[7]), 2))
- fmt.Println(name[8], strconv.FormatInt(int64(name[8]), 2))
- // 2. 获取字符串的长度=9,utf-8编码的字节长度
- fmt.Println(len(name)) // len获取的是字节长度
- // 3. 字符串转换为一个字节的切片
- byteSets := []byte(name) // [233 169 172 233 166 168 229 189 164]
- fmt.Println(byteSets)
- // 4. 字节的切片转换为字符串
- byteList := []byte{233, 169, 172, 233, 166, 168, 229, 189, 164}
- targetString := string(byteList)
- fmt.Println(targetString)
- // 5. 将一个字符串转换为 unicode字符集码点的切片 (rune) 9a6c => 马 99a8 => 馨 5f64 => 彤
- // rune使用的是unicode中的ucs4
- byteRune := []rune(name)
- fmt.Println(byteRune) // [39532 39336 24420]
- fmt.Println(byteRune[0], strconv.FormatInt(int64(byteRune[0]), 16))
- fmt.Println(byteRune[1], strconv.FormatInt(int64(byteRune[1]), 16))
- fmt.Println(byteRune[2], strconv.FormatInt(int64(byteRune[2]), 16))
- // rune切片转换为字符串
- runeList := []rune{39532, 39336, 24420}
- target2String := string(runeList)
- fmt.Println(string(target2String))
- // 字符长度
- runeLength := utf8.RuneCountInString(name) // 根据字符串统计字符长度
- two := utf8.RuneCount(byteList) // 根据字节切片统计字符长度
- fmt.Println(runeLength)
- fmt.Println(two)
- }
2. 常见15个功能
- package main
- import (
- "fmt"
- "reflect"
- "strconv"
- "strings"
- "unicode/utf8"
- )
- func main() {
- var name = "武沛齐"
- var name2 = "WuPeiQi"
- var name3 = " wupeiqiqi "
- var name4 = "抬老子的意大利的炮来"
- // 1. 获取字符串的长度
- fmt.Println(len(name)) // 字节长度
- fmt.Println(utf8.RuneCountInString(name)) // 字符长度
- // 2. 是否以xx开头
- ret1 := strings.HasPrefix(name, "武")
- fmt.Println(ret1)
- // 3. 是否以xx结尾
- ret2 := strings.HasSuffix(name, "齐")
- fmt.Println(ret2)
- // 4. 是否包含
- ret3 := strings.Contains(name, "沛")
- fmt.Println(ret3)
- // 5. 变大写
- ret4 := strings.ToUpper(name2)
- fmt.Println(ret4)
- // 5. 变小写
- ret5 := strings.ToLower(name2)
- fmt.Println(ret5)
- // 6. 去两边
- ret6 := strings.Trim(name3, " ")
- ret7 := strings.TrimLeft(name3, " ")
- ret8 := strings.TrimRight(name3, " ")
- fmt.Println(ret6, ret7, ret8)
- // 7. 替换,第三个参数代表从左到右替换1、2和所有
- ret9 := strings.Replace(name3, "i", "I", 1)
- ret10 := strings.Replace(name3, "i", "I", 2)
- ret11 := strings.Replace(name3, "i", "I", -1)
- fmt.Println(ret9, ret10, ret11)
- // 8. 分割
- ret12 := strings.Split(name4, "的")
- fmt.Println(ret12)
- // 9. 拼接1,不建议
- message := "我爱" + "北京天安门"
- fmt.Println(message)
- // 10 拼接2,建议 效果高一些
- dataSlice := []string{"我爱", "北京天安门"}
- ret13 := strings.Join(dataSlice, "-")
- fmt.Println(ret13)
- // 效率更高一些 go1.10之后
- var builder strings.Builder
- builder.WriteString("我爱-")
- builder.WriteString("北京天安门")
- value := builder.String()
- fmt.Println(value)
- // 11. string 转换为 int类型
- num1 := "123465"
- ret14, _ := strconv.Atoi(num1) // 方法1 结果是int类型
- fmt.Println(ret14, reflect.TypeOf(ret14))
- ret15, _ := strconv.ParseInt(num1, 10, 0) // 结果是int64类型
- fmt.Println(ret15, reflect.TypeOf(ret15))
- // 12. int 转换为 string
- num2 := 789
- ret16 := strconv.Itoa(num2)
- fmt.Println(ret16, reflect.TypeOf(ret16))
- ret17 := strconv.FormatInt(int64(num2), 10)
- fmt.Println(ret17, reflect.TypeOf(ret17))
- // 13. 字符串和字节切片
- byteSlice := []byte(name) // 字符串转字节
- fmt.Println(byteSlice) // [230 173 166 230 178 155 233 189 144]
- // 字节转字符串
- targetString := string(byteSlice)
- fmt.Println(targetString)
- // 14. 字符串和rune切片
- runeSlice := []rune(name) // 字符串转rune切片
- fmt.Println(runeSlice)
- // rune切片转字符串
- targetString2 := string(runeSlice)
- fmt.Println(targetString2)
- // 15. string 和 字符
- // 根据码点找到对应的字符信息
- v1 := string(65) // 数字转字符
- fmt.Println(v1, reflect.TypeOf(v1)) // A string
- // 字符串转rune数字和字节长度
- v2, size := utf8.DecodeRuneInString("武")
- fmt.Println(v2, size)
- // 应用场景:生成一个随机数,然后调用string得到一个随机字符
- }
3. 字符串索引切片和循环
- package main
- import "fmt"
- func main() {
- var name = "a武沛齐"
- // 1. 索引获取字节
- ret1 := name[0]
- fmt.Println(ret1)
- // 2. 切片获取字节区间
- ret2 := name[:3]
- fmt.Println(ret2)
- // 3. 手动循环获取所有字节
- for i := 0; i < len(name); i++ {
- fmt.Println(i, name[i])
- }
- // 4. for range 循环获取所有字符
- for index, item := range name {
- fmt.Println(index, item, string(item))
- }
- // 5. 转换成rune切片
- runeSlice := []rune(name)
- fmt.Println(runeSlice) // [97 27494 27803 40784]
- fmt.Println(runeSlice[0], string(runeSlice[0]))
- fmt.Println(runeSlice[1], string(runeSlice[1]))
- }
golang中字符串的底层实现原理和常见功能的更多相关文章
- golang中发送http请求的几种常见情况
整理一下golang中各种http的发送方式 方式一 使用http.Newrequest 先生成http.client -> 再生成 http.request -> 之后提交请求:clie ...
- golang中字符串内置函数整理
字符串内置函数 1. 判断字符串的长度 str := "korea国" fmt.Println("str len=", len(str)) 2. 字符串遍历,同 ...
- golang中字符串的查找方法小结
1)func Contains(s, substr string) bool这个函数是查找某个字符是否在这个字符串中存在,存在返回true 示例如下: import ( "fmt" ...
- golang中字符串、数值、2进制、8进制、16进制、10进制、日期和字符串之间的转换
package main import ( "fmt" "reflect" "strconv" "time" ) fun ...
- golang中字符串、bytes类型切片、16进制字符串之间的转换
func main() { // 字符串转bytes类型 name := "马亚南" fmt.Println(name) // 马亚南 bName := []byte(name) ...
- golang中字符串-字节切片,字符串-字符切片的互转
package main import ( "fmt" "reflect" ) func B2S(bs []uint8) string { // 将字节切片转换 ...
- Golang 入门 : 字符串
在 Golang 中,字符串是一种基本类型,这一点和 C 语言不同.C 语言没有原生的字符串类型,而是使用字符数组来表示字符串,并以字符指针来传递字符串.Golang 中的字符串是一个不可改变的 UT ...
- golang 中string和int类型相互转换
总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: int, err := strconv.Atoi(string)string转成int64: int64, e ...
- 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...
随机推荐
- JAVA生成订单编号工具类
JAVA根据时间戳和随机数方式生成订单编号工具类 OrderUtils.java package com.util; import java.text.DateFormat; import java. ...
- 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告
[LeetCode]106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告(Python) 标签: LeetCode ...
- Primitive Roots(poj1284)
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3928 Accepted: 2342 D ...
- 洛谷 P1434 [SHOI2002]滑雪(DP,记忆化搜索)
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- 基于Spring MVC + Spring + MyBatis的【图书信息管理系统(二)】
资源下载:https://download.csdn.net/download/weixin_44893902/35123371 练习点设计:添加.删除.修改 一.语言和环境 实现语言:JAVA语言. ...
- Java工程编码格式由GBK转化成utf-8(编码格式互转)
在写项目的过程中我发现有的地方编码格式被设置成了 gbk 如果用eclipse等工具直接改回utf-8编码格式则会出现乱码. 下载:https://download.csdn.net/download ...
- 4.1.4 统计“锦途网”旅游线路平均价格,并采用尽可能多的方式将该价格赋给用户会话变量 @avg_short_price,并输出该变量
查看本章节 查看作业目录 需求说明: 统计"锦途网"旅游线路平均价格,并采用尽可能多的方式将该价格赋给用户会话变量 @avg_short_price,并输出该变量 在 MySQL ...
- maven dependency全局排除
http://www.voidcn.com/article/p-zychsdnd-bqg.html 个人比较喜欢log4j.properties这种配置文件,而springboot默认使用logbac ...
- Hadoop Jobhistory配置启用
Hadoop Jobhistory记录下已运行完的MapReduce作业信息并存放在指定的HDFS目录下, 默认情况下是没有启动的,需要配置完后手工启动服务. 1.修改hadoop的配置文件mapre ...
- [学习笔记] RabbitMQ的安装使用
安装 使用命令行安装,会自动管理依赖(推荐): choco install rabbitmq 安装包安装: 以管理员身份安装64位的 Erlang. 下载并安装 RabbitMQ 服务.下载地址. R ...