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中字符串的底层实现原理和常见功能的更多相关文章

  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. Centos7使用Docker启动elasticsearch服务秒退

    首先查看docker启动日志 docker logs -f 容器id 查看报错信息 OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepG ...

  2. 【LeetCode】42. Trapping Rain Water 接雨水 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解 保存左右最大值 单调栈 日期 题目地址:ht ...

  3. 【LeetCode】636. Exclusive Time of Functions 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 日期 题目地址:https://leetcode ...

  4. 【LeetCode】817. Linked List Components 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. Back to Underworld(lightoj 1009)

    1009 - Back to Underworld    PDF (English) Statistics Forum Time Limit: 4 second(s) Memory Limit: 32 ...

  6. Java实习生常规技术面试题每日十题Java基础(七)

    目录 1. Java设计模式有哪些? 2.GC是什么?为什么要有GC? 3. Java中是如何支持正则表达式. 4.比较一下Java和JavaSciprt. 5.Math.round(11.5) 等于 ...

  7. .net Core WebApi使用AutoFac

    1.在要添加的项目中选中 依赖项->右键->管理NuGet程序包(N) 2.在NuGet包管理器中输入Autofac,安装选中文件 3.在项目中找到Program.cs文件,添加如下代码 ...

  8. 制造运营管理 (MOM) 的工作流驱动方法

    介绍 "在企业中使用的任何技术的第一条规则是,应用于高效运营的自动化将放大效率.第二个是自动化应用于低效率的操作会放大低效率." - 比尔盖茨 . 工作流是结构化的活动,主要涉及人 ...

  9. Oracle数据库安装Version12c

    1.安装规划 Oracle数据库版本: Linuxamd64_12102_database 12c Linux服务器系统: CentOS Linux release 7.5.1804 (Core) 6 ...

  10. PostgreSQL相关知识概念

    本文主要介绍PostgreSQL数据库的一些重要知识点, 包括数据库.模式.表空间.用户/角色等概念和关系, 帮助用户理解PostgreSQL数据库的重要概念, 从而能够更好的使用PostgreSQL ...