介绍

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

字符串操作

常见的字符串操作如下:

go语言 字符串 字符串数组中查找 go语言字符串操作_ico

示例代码如下:

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字符,被用来区分字符值和整数值。
runeint32的别名,常用来处理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))
}