组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号’
包裹起来。
如:
var a := 65
var b := 66
Go 语言的字符有以下两种:
uint8
类型,或者叫 byte
型,代表了ASCII码的一个字符。
rune
类型,代表一个 UTF-8字符。
byte
,占用1个节字,就 8 个比特位(2^8 = 256,因此 byte 的表示范围 0->255),所以它和 uint8
类型本质上没有区别,它表示的是 ACSII 表中的一个字符。
如下这段代码,分别定义了 byte 类型和 uint8 类型的变量 a 和 b
import "fmt"
func main() {
var a byte = 65
// 8进制写法: var a byte = '\101' 其中 \ 是固定前缀
// 16进制写法: var a byte = '\x41' 其中 \x 是固定前缀
var b uint8 = 66
fmt.Printf("a 的值: %c \nb 的值: %c", a, b)
// 或者使用 string 函数
// fmt.Println("a 的值: ", string(a)," \nb 的值: ", string(b))
}
rune
,占用4个字节,共32位比特位,所以它和 uint32
本质上也没有区别。它表示的是一个 Unicode字符(Unicode是一个可以表示世界范围内的绝大部分字符的编码规范)。
import (
"fmt"
"unsafe"
)
func main() {
var a byte = 'A'
var b rune = 'B'
fmt.Printf("a 占用 %d 个字节数\nb 占用 %d 个字节数", unsafe.Sizeof(a), unsafe.Sizeof(b))
}
/*
输出的结果为:
a 占用 1 个字节数
b 占用 4 个字节数
*/
由于 byte
类型能表示的值是有限,只有 2^8=256 个。所以如果你想表示中文的话,你只能使用 rune
类型。
字符串底层是一个byte数组
,所以可以和[]byte
类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
要修改字符串,需要先将其转换成[]rune
或[]byte
,完成后再转换为string
。无论哪种转换,都会重新分配内存,并复制字节数组。
func changeString() {
s1 := "big"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'p'
fmt.Println(string(byteS1))
s2 := "白萝卜"
runeS2 := []rune(s2)
runeS2[0] = '红'
fmt.Println(string(runeS2))
}
字节集合转换成字符串
byteList := []byte{232 165 191 231 142 175 229 141 129 228 184 137 233 131 142}
targetString := string(byteList)
fmt.Println(targetString)
// 输出的结果为:西环十三郎
字符串转换成字节集合
var name = "西环十三郎"
byteList := []byte(name)
fmt.Println(byteList)
// 输出的结果为:[232 165 191 231 142 175 229 141 129 228 184 137 233 131 142]
rune转换成字符串
runeSet := []rune{35199, 29615, 21313, 19977, 37070}
fmt.Println(string(runeSet))
// 输出的结果为:西环十三郎
字符串转换成rune
runeSet := []rune(name)
fmt.Println(runeSet)
// 输出的结果为:[232 165 191 231 142 175 229 141 129 228 184 137 233 131 142]
基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建