Go字符串的应用
1 计算字符串的长度
Go 语言的内建函数len(),可以用来获取切片、 字符串 、通道 channel )等的长度。
下面的代码可以用len()来获取字符串的长度。
tip1 := "genji is a ninja"
fmt.Println(len(tip1))
总结
• ASCII 字符串长度使Len()函数
•Unicode 字符串长度使用 utf8 .RuneCountlnString() 函数。
2 遍历字符串
-
遍历每一个ASCII字符
ASCII 字符串遍历直接使用下标。
-
按Unicode字符遍历字符串
字符串遍历用 for range。
示例代码如下:
theme := "狙击 start"
for i :=0; i < len(theme); i++ {
fmt.Printf("ascii: %c %d\n", theme[i], theme[i])
}
for _, s := range theme{
fmt.Printf("ascii: %c %d\n",s, s)
}
3 获取字符串的某一段字符
总结:
字符串索引 比较常用的有如下几种方法。
-
strings.Index :正向搜索子字符串。
-
strings.Lastlndex :反向搜索子字符串
-
搜索的起始位 可以通过切片偏移制作
示例代码如下:
tracer := "死神来了, 死神Bye Bye"
comma := strings.Index(tracer, ", ")
pos := strings.Index(tracer[comma:], "死神")
fmt.Println(comma, pos, tarcer[comma+pos:])
4 修改字符串
Go 的字符串无法直接修改每一个字符元素,只能通过重新构造新的字符串井赋值给原来的字符串变量实现。请参考下面的代码:
angle := "Heros never die"
angleBytes := []byte(angle)
for i := 5; i <= 10; i++ {
angleBytes[i] = ' '
}
fmt.Println(string(angleBytes))
Go 中的字符串和其他高级语 (Java、C#)一样,默认是不可变的( immutable)
字符串不可变有很多好处,如天生线程安全,大家使用的都是只读对象,无须加锁;
再者,方便内存共享,而不必使用写时复制( Copy On Write )等技术;字符串 hash 值也只需要制作一份。
所以说,代码中实际修改的是[]byte, []byte在Go语言中是可变的 ,本身就是切片
在完成了对[] byte 操作后,使用 string() 将[] byte 转为字符串时,重新创建一个新的字符串。
总结:
-
Go 字符串是不可变的。
-
修改字符串时,可以将字符串转换为[]byte 进行修改。
-
[]byte 和string 可以通过强制类型转换互转。
5 连接字符串
StringBuilder 的机制来进行高效的字符串连接,例如:
6 格式化
格式化在逻辑中非常常用。使用格式化函 要注意写法:
fmt.Sprintf (格式化样式,参数列表...)
-
格式化样式 宇符串形式,格式化动词以%开头。
-
参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。
Go 语言中 格式化的命名延续C语言风格
下表标出了常用的一些格式化样式中的动词及功能
动词 | 功能 |
---|---|
%v | 按值的本来值输出 |
%+v | 在%v的基础上,对结构体字段名和值进行展开 |
%#v | 输出Go语言语法格式的值 |
%T | 输出Go语言语法格式的类型和值 |
%% | 输出%本体 |
%b | 整型以2进制方式显示 |
%o | 整型以8进制方式显示 |
%d | 整型以10进制方式显示 |
%x | 整型以16进制方式显示 |
%X | 整型以16进制、字母大写方式显示 |
%U | Unicode字符 |
%f | 浮点数 |
%p | 指针,16进制方式显示 |