介绍
go
语言当中,字符串是一个基础数据类型。在go
中的字符串,都是采用UTF-8
字符集编码。
声明字符串
go
语言当中,声明字符串一般采用"字符串内容"
或者两个``
的形式来声明字符串。
package main
import "fmt"
func main() {
a := "hello"
b := `world`
fmt.Print(a,b)
}
查询字符串
我们可以根据类似于数组下标的形式来查询字符串指定位置的字符。例如:
package main
import "fmt"
func main() {
str_test := "hello,world!"
fmt.Print(string(str_test[0])) // h 通过string()方法,可以将ascii码变为字符
}
更改字符串
需要注意的是,虽然查询某个下标对应字符的方式与数组相似,但是却不能进行值的更改,例如下面的代码就会引起编译错误。
str_test := "hello"
str_test[0] = 'x'
在go
中,字符串是不可变的。
但如果真的想要修改字符串,可以参考下面的写法:
s := "hello"
c := []byte(s) // 先将s 转换为byte类型
c[0] = 'x' // 修改值
s2 := string(c) // 重新转换为string类型
fmt.Print(s2) // xello
字符串操作
常见的字符串操作如下:
示例代码如下:
func t2(){
// 拼接字符串
s := "你好"
y := "吃饭了没"
fmt.Print(s+y)
}
func t3(){
// 修改字符串
s := "hello"
s = "c" + s[1:] // 虽然字符串没有办法直接修改,但是可以采用截取再拼接的形式来组合字符串
fmt.Println(s) // cello
}
func t4(){
// 声明一个多行的字符串
s := `你好
hello`
fmt.Print(s)
}
` 括起的字符串为Raw字符串,即字符串在代码中的形式就是打印时的形式,它没有字符转义,换行也将原样输出。
字符串遍历
go
语言支持两种方式遍历字符串。
第一种是以字节数组的方式遍历:
func t5(){
// 字符串遍历 -- 以字节数组的形式
str := "Hello,World!"
n := len(str)
for i:=0;i<n;i++{
ch := str[i] // 依据下标取字符串中的字符,类型为byte
fmt.Println(i,string(ch))
}
}
如果字符串中有中文,那么每个中文占据三个字节,而不是一个字节。
第二种遍历形式是以Unicode
字符遍历:
func t6(){
str := "hello,世界"
for i ,ch := range str{
fmt.Println(i,string(ch)) // ch 的类型为rune
}
}
字符类型
go
语言当中,支持两个字符类型,一个是byte
(uint8的别名,常用来处理ascii字符),代表UTF-8
字符串的单个字节的值;另外一个是rune
,代表单个Unicode
字符,被用来区分字符值和整数值。rune
是int32
的别名,常用来处理unicode或utf-8字符。
先来看下面的示例:
func t7(){
str := "你好"
fmt.Print(str[0]) // 228
fmt.Print(string(str[0])) //ä
}
在示例当中,我们通过下标的形式没有办法访问到我们期待的数据("你"字),为什么呢?
在go
中,string
底层使用byte
数组存的,并且是不可改变的。例如:s:="你好" fmt.print(s)
输出为6,因为中文字符在UTF-8中是使用3个字节存储的(Unicode中是使用2个字符存储,golang默认编码是utf-8)。
如果想要通过下标访问中文,达到我们预期的效果,需要先转换为rune切片在使用len()函数。
func t7(){
str := "你好"
newStr := []rune(str)
fmt.Print(newStr[0]) // 20320
fmt.Print(string(newStr[0])) // 你 转换成rune切片后就可以通过下标访问到中文了,否则中文是使用byte存储的
fmt.Print(len(newStr)) // 2
//fmt.Print(str[0]) // 228
//fmt.Print(string(str[0])) //ä
}
如果只是想要获取有几个字这样的长度,可以如下进行更改:
func t8() {
str := "你好"
fmt.Print(utf8.RuneCountInString(str))
}