【go基础】go的字符串(byte和rune)

161 阅读2分钟

Go语言将字符串作为一种原生基本数据类型,字符串的初始化可以使用字符串字面量。

var a = "hello"

1)字符串是常量,可以通过类似数组的索引访问字节单元但是不能修改。

var a = "hello"
b := a[0]
var a = "hello"b := a[0]a[1] = 'a' // error

2)字符串尾部不包含'\0',这里和C很不同。

3)字符串类型底层是一个二元数据结构,一个是指针,指向字节数组起点,另一个是长度,也就是说字符串类型包含了长度信息。

使用 len(s) 获取字符串长度

4)基于字符串创建的切片和原字符串指向相同的底层字符数组同样不能修改,因为这种切片操作返回的仍然是string而不是slice。

a := "hello,world"
b := a[0:4]
c := a[1:]
d := a[:4]

5)字符串运算

a := "hello"
b := "world"
c := a + b  使用加号,字符串拼接
len(a) // len 计算字符串长度
// 遍历字节数组
for i := 0; i < len(c); i ++{    
    fmt.println(c[i])
}
// 遍历rune数组, range 返回 index + value
for i, v := range d{    
    fmt.println(i, v)
}

6)byte是uint8类型的别名,rune则是int32类型的别名。这2个别名用来对字符串进行一些操作。

byte---单字节unicode

rune---1-4个字节的unicode(如包含中文的字符串)

7)想要对字符串进行修改,需要先把字符串转成数组

a := "hello"
b := []byte(a)
a[1] = 'a' // error
b[1] = 'a'
fmt.Printf("%s", b) // hallo

8)字符串和切片的转换:

b := []byte(a)  转换为字节数组 uint8类型
c := []rune(a) // 转换为unicode字节码数组

9)对包含中文的字符串的截取

aa := "go语言编程"
bb := []rune(aa)

fmt.Println(string(bb[0:4])) // go语言