Go 字符串 (string)

字符串类型为 string,使用双引号或者反引号包起来

字符串形式

反引号

当使用反引号时不会对字符串进行转义,并可以包含多行文本

示例:

package main

import "fmt"

func main() {
	a := `
hello
world
!
	`
	b := `hello \n world`
	fmt.Println(a)
	fmt.Println(b)
}

输出结果:


hello
world
!
        
hello \n world

双引号

当使用双引号时,只能通过 \n 进行换行
示例:

package main

import "fmt"

func main() {
	a := "hello \n world"
	fmt.Println(a)
}

输出结果:

hello 
 world

切片

一个字节

如果直接使用索引进行取值,会取到一个字节
示例:

package main

import (
	"fmt"
)

func main() {
	a := "abc"
	for i := 0; i < len(a); i++ {
		fmt.Printf("%v, %T\n", a[i], a[i])
	}
}

输出结果:

97, uint8
98, uint8
99, uint8

多个字节

如果通过切片取出来的还是字符串,即使只取了一个字节也是一个字节的字符串
示例:

package main

import (
	"fmt"
)

func main() {
	a := "abc"
	for i := 0; i < len(a); i++ {
		fmt.Printf("%v, %T\n", a[i: i+1], a[i: i+1])
	}
}

输出结果:

a, string
b, string
c, string

不可修改

Go 中字符串类型是不能修改的,多个字符串低层都可以共用一段内存,这使得复制字符串、生成子串的成本都非常低

修改

有两种方式可以改变字符串值:

1. 重新赋值

新开辟一段内存存放新的字符串

func main() {
	a := "hello world"
	fmt.Println(a)
	a := "Hello world"
	fmt.Println(a)
}

2. 先转换为切片,修改之后再改回来

注意:如果要修改像中文字符之类超过 3 个字节的字符,需要转换为 rune 而不是 byte
关于 rune 和 byte <- 点击查看
示例:

func main() {
	a := "hello world"
	b := []rune(a)
	b[0] = 'H'
	a = string(b)
	fmt.Printf("%v", a)
}

遍历

由于 len(string) 获得的是字符串的字节数,所以直接通过长度遍历遍历的是字节数,超过 1 字节的字符无法正常遍历
示例:

func main() {
	a := "你好 world"
	for i := 0; i < len(a); i ++ {
		fmt.Printf("%c - %T\n",a[i],  a[i])
	}
}

遍历的是每个字节

for range

通过 for range 遍历可以正常地显示每个字符
示例:

func typeString() {
	for _, v := range a {
		a := "你好 world"
		fmt.Printf("%c - %T\n",v,  v)
	}
}

遍历的是每个字符

posted on 2019-12-20 20:20  doubtful  阅读(3588)  评论(0编辑  收藏  举报

导航