字符串是一个不可改变的字节序列,类型为原生数据类型,同 int、bool、float32、float64 是一样的。
1.字符串常用API
| 函数 | 说明 |
|---|---|
| len() | 可以获取字符串字节数组的长度。 |
| RuneCountInString() | 可以获取字符串字符的长度。 |
Go 语言的字符串都以UTF-8 格式保存,每个中文占用3个字节,所以 "牛牛编程"占用12个字节。
package main
import (
"fmt"
"unicode/utf8"
_ "unicode/utf8"
)
func main() {
str1 := "www.simoniu.com"
fmt.Println("字节数组长度:", len(str1))
fmt.Println("字符个数:", utf8.RuneCountInString(str1))
str2 := "牛牛编程"
fmt.Println("字节数组长度:", len(str2))
fmt.Println("字符个数:", utf8.RuneCountInString(str2))
str3 := "牛牛编程 www.simoniu.com"
for _, s := range str3 {
fmt.Printf("Unicode: %c %d\n", s, s)
}
}
运行结果:
字节数组长度: 15
字符个数: 15
字节数组长度: 12
字符个数: 4
Unicode: 牛 29275
Unicode: 牛 29275
Unicode: 编 32534
Unicode: 程 31243
Unicode: 32
Unicode: w 119
Unicode: w 119
Unicode: w 119
Unicode: . 46
Unicode: s 115
Unicode: i 105
Unicode: m 109
Unicode: o 111
Unicode: n 110
Unicode: i 105
Unicode: u 117
Unicode: . 46
Unicode: c 99
Unicode: o 111
Unicode: m 109
2.获取子串
可以通过 str[i:j] 基于原始的 str 字符串的第 i 个字节开始到第 j 个字节(并不包含 j 本身)生成一个新字符串。生成的新字符串将包含 j-i 个字节。
不管 i 还是 j 都可以不填写,若不填写,将采用0作为开始位置,采用len(s)作为结束的位置。
package main
import (
"fmt"
"strings"
_ "unicode/utf8"
)
func main() {
str1 := "牛牛编程 www.simoniu.com"
fmt.Println(str1[0:12]) // 输出 牛牛编程
// 通过 strings.Index() 函数获取字符 . 的下标
index := strings.Index(str1, "程")
fmt.Println("index=", index)
fmt.Println(str1[0 : index+3]) // 输出 牛牛编程
str2 := "simoniu.com"
fmt.Println(str2[:7]) // "simoniu"
fmt.Println(str2[7:]) // ".com"
fmt.Println(str2[:]) // "simoniu.com"
}
运行结果:
牛牛编程
index= 9
牛牛编程
simoniu
.com
simoniu.com
3.修改字符串
与Java语言类似,Go 语言中,无法直接修改字符串中的字符,只能通过重新构造一个新的字符串并赋值给原来的字符串实现:
例如:
package main
import (
"fmt"
_ "unicode/utf8"
)
func main() {
str := "simoniu.com"
// 将字符串转换为字符串数组
strBytes := []byte(str)
fmt.Println("修改前长度:", len(str))
// 将.com 替换为空格
for i := 7; i < len(str); i++ {
strBytes[i] = ' '
}
fmt.Println(string(strBytes))
fmt.Println("修改后长度:", len(string(strBytes)))
}
运行结果:
修改前长度: 11
simoniu
修改后长度: 11
4.拼接字符串
Go 语言同绝大数其他语言一样,通过操作符 + 可以将两个字符串连接构造一个新字符串:
package main
import (
"fmt"
_ "unicode/utf8"
)
func main() {
str := "simoniu.com"
// .com修改为.net
str = str[0:8] + "net"
fmt.Println(str)
}
运行结果:
simoniu.net
除了使用 + 来拼接字符串,Go 语言中也有类似于 Java 语言中 StringBuilder 的机制,来进行更高效率的字符串拼接, 上面的例子代码改写如下:
package main
import (
"bytes"
"fmt"
_ "unicode/utf8"
)
func main() {
str1 := "simoniu.com"
str2 := "net"
// 声明字节缓冲
var stringBuilder bytes.Buffer
// 将字符串写入缓冲
stringBuilder.WriteString(str1[0:8])
stringBuilder.WriteString(str2)
// 将缓冲以字符形式输出
fmt.Println(stringBuilder.String())
}
5.字符串比较
字符串可以用 == 、 <、> 进行比较;比较通过逐个字节比较完成的,因此比较的结果是字符串自然编码的顺序。
package main
import (
"fmt"
_ "unicode/utf8"
)
func main() {
str1 := "simoniu.com"
str2 := "simoniu.net"
str3 := "simoniu.com"
// 是否相等标志位
isSame := false
if str1 == str2 {
isSame = true
}
fmt.Println(isSame)
if str1 == str3 {
isSame = true
}
fmt.Println(isSame)
}
运行结果:
false
true
6.字符串转义符
与其它语言类似,常见转义符包括回车、换行、单双引号、制表符等:
| 转义符 | 含义 |
|---|---|
| \r | 回车符 |
| \n | 换行符 |
| \t | 制表符 |
| \' | 单引号 |
| \'' | 双引号 |
| \ | 反斜杠 |
7.格式化输出
字符串格式化应用场景十分丰富,格式如下:
fmt.Sprintf(格式化样式, 参数列表)
package main
import (
"fmt"
)
func main() {
a := 100
b := 200
// 两整型参数格式化
fmt.Printf("第一个数: %d, 第二个数: %d\n", a, b)
str1 := "hello "
str2 := "simoniu.com"
// 两字符串参数格式化
content := fmt.Sprintf("1: %s, 2: %s\n", str1, str2)
fmt.Println(content)
}
小结: