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 ...
随机推荐
- c++ 设计模式概述之策略
代码写的不规范,目的是为了缩短文章篇幅,实际中请不要这样做. 1.概述 类比现实生活中的场景,比如,我需要一块8G内存条,我可以选择:A.去线下实体店买,B.线上购买,C.其他渠道. 再比如,吃饭餐具 ...
- 从头造轮子:python3 asyncio 之 run(2)
前言 书接上文,本文造第二个轮子,也是asyncio包里面非常常用的一个函数run 一.知识准备 ● 相对于run_until_complete,改动并不大,就是将入口函数重新封装了一下,基础知识主要 ...
- Elasticsearch核心技术(五):搜索API和搜索运行机制
本文将从数据存储和搜索的角度简单分析Elasticsearch的搜索运行机制,主要涉及搜索API.搜索机制.存在问题和解决方案. 4.1 Search API Search API允许用户执行一个搜索 ...
- Normalization Methods
目录 概 主要内容 Batch Normalization Layer Normalization Instance Normalization Group Normalization Ioffe S ...
- MarkDown 使用方法
MarkDown学习 标题的使用 在MarkDown中标题的使用,是用#+空格+标题名称,来进行编辑的.一个#就是一级标题, 两个#就是两级标题,以此类推,一定要加空格,否则无效 ### 三级标题 ...
- idea解决springboot项目中log4j漏洞升级问题
最近阿里云团队发现log4j漏洞,危险级别:严重,相关资讯 https://m.sohu.com/coo/hsdt/506958086_355140 https://www.sohu.com/a/50 ...
- CS5268替代AG9321MCQ 替代AG9321方案 TYPEC转HDMI多功能拓展坞
台湾安格AG9321MCQ是一款TYPEC拓展坞产品方案,他集中了TYPEC 转HDMI VGA PD3.0快充 QC3.0数据传输 I2S接口的音频DAC输出以及可以各种读卡器功能. Caps ...
- SQLServer中的CTE(Common Table Expression)通用表表达式使用详解
概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...
- Xstart远程连接Linux图形用户界面
目标: 在自己的Windows桌面打开Linux的firefox浏览器 工具: Windows: Xmanager的Xstart工具 Linux: xterm,firefox 说明: 使用Xstart ...
- RabbitMQ基础教程系列
Ubuntu16.04下,erlang安装和rabbitmq安装步骤 Ubuntu16.04下,rabbimq集群搭建 C# .net 环境下使用rabbitmq消息队列 .net core使用rab ...