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 ...
随机推荐
- centos7使用Dockerfile运行mysql库并初始化数据
Dockerfile文件(文件名一定要这个) FROM mysql:5.7 WORKDIR /docker-entrypoint-initdb.d ENV LANG=C.UTF-8 ADD test. ...
- JAVA里List集合中的对象根据对象的某个属性值降序或者升序排序
需要使用JDK1.8及以上 package com.stream; import java.util.Comparator; import java.util.List; public class T ...
- 基于DNN的残余回声抑制
摘要 由于功率放大器或扬声器的限制,即使在回声路径完全线性的情况下,麦克风捕获的回声信号与远端信号也不是线性关系.线性回声消除器无法成功地消除回声的非线性分量.RES是在AES后对剩余回声进行抑制的一 ...
- 7、滑动窗口套路算法框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- c/c++11封装UDP,支持ipv4和ipv6,支持接收和发送
更新日志 11/06/2021 1.增加IPV6 2.ipv6通过windows10初步测试 3.ipv6包括: 接收和发送 5.增加错误代码接口 6.本机IPv6截图 7.编译通过截图 8.ipv6 ...
- 1137 - Expanding Rods
1137 - Expanding Rods PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit: 32 M ...
- SuperPixel
目录 SLIC Superpixel algorithm 距离函数的选择 代码 Gonzalez R. C. and Woods R. E. Digital Image Processing (For ...
- 【】(Git)用动图展示10大Git命令
1.说明 git merge.git rebase.git reset.git revert.git fetch.git pull.git reflog-- 你知道这些 git 命令执行的究竟是什么任 ...
- linux 之 expect 交互操作(自动输入密码)
场景 需要实现执行一个命令,并自动输入密码. 实现 通过expect命令实现 spawn 交互程序开始后面跟命令或者指定程序expect 获取匹 ...
- 初识python: 继承
继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为"子类"或"派生类". 被继承的类称为"基 ...