
Golang系列之字符串类型基本介绍
在go语言中,字符串是一种基本类型,和其它开发语言不同,go的字符串是由单个字节连接起来的。go语言统一使用utf-8编码标识Unicode文本。当字符为ASCII编码时,占用1个字节,其它字符占用2到4个字节,中文占用3个字节
补充,这里读者可能会有疑问,ASCII 、Unicode、UTF-8有什么关系? ASCII:编码包含了 33 个控制字符和 95 个可显示字符,不支持中文字符 Unicode:是一个更大范围的编码表集合,比ASCII更广,囊括了目前世界上所有语言的所有字符 UTF-8:有别于ASCII、Unicode,UTF-8是Unicode编码的实现方式之一,会将 Unicode 字符以某种方式进行编码 详细的可以参考阮一峰大佬的博客:字符编码笔记:ASCII,Unicode 和 UTF-8
golang字符串:
// 定义string变量
var str string
str = "golang"
// 赋值声明变量str1
str1 := "golang"
// 打印字符串和对应字符长度
fmt.Printf("%s length is %d \n" , str , len(str))go中的string字符串值,是不可以改变对应的字符值的,但是整个字符串可以更改
var str string = "golang"
str = "test"
// 编译报错,cannot assign to str[0]
// str[0] = 's'// 使用反引号
res := `programming language :
		Java
		Golang
		Python
		PHP
		...
		`
// 双引号也可以实现类似效果,需要加上转义字符等等
res1 := "programming language :\n" +
	"Java\n" +
	"Golang\n" +
	"Python\n" +
	"PHP\n" +
	"...\n"
fmt.Printf("%s" , res)
fmt.Printf("%s" , res1)常用的转义字符:
\t:制表符,通常用于排版\n:换行符\\:反斜杆自身\":一个"\r:一个回车+号就行str := "golang"
str = str + " learning"
fmt.Printf("%s" , str)这里有个注意事项,如果字符串太长,
+必须加到上一行的后面,不能换行
str[1]直接获取,而不用将字符串类型转为数组类型,字符串获取对应区间的数据,遵循“左闭右开”的原则str := "golang,learning"
// [0:6) 左闭右开区间
str1 := str[:6]
// 特殊情况,这里两边都是闭区间[7:len(str)]
str2 := str[7:]
// 注意,这里也是[0:6)
str3 := str[0:6]
fmt.Println("str1=" , str1 , "str2=" , str2 , "str3=", str3)str := "golang learning(学习)"
// 遍历字符串
for i := 0 ; i <len(str) ; i++ {
	ch := str[i]
	fmt.Println( i , ch,  string(ch))
}打印了之后,发现中文的都乱码了,为什么?提示一下,这种方式遍历使用的是字节遍历,前面的学习知道,go中字符串是由字节组成的,byte的取值范围是0~255
0 103 g
1 111 o
2 108 l
3 97 a
4 110 n
5 103 g
6 32  
7 108 l
8 101 e
9 97 a
10 114 r
11 110 n
12 105 i
13 110 n
14 103 g
15 40 (
16 229 å
17 173 
18 166 ¦
19 228 ä
20 185 ¹
21 160  
22 41 )有看过我上一篇博客的读者,链接https://cloud.tencent.com/developer/article/1952224,可以知道中文对应的Unicode编码是超过255的,而且中文需要占用3个字节,byte只占用1个字节,所以是不能打印出中文字符的
所以,需要换种方法,使用range关键字,这种方法,使用了rune存储字符
str := "golang learning(学习)"
for i , ch := range str {
	fmt.Println( i , ch,  string(ch))
}打印,中文也可以打印出来:
0 103 g
1 111 o
2 108 l
3 97 a
4 110 n
5 103 g
6 32  
7 108 l
8 101 e
9 97 a
10 114 r
11 110 n
12 105 i
13 110 n
14 103 g
15 40 (
16 23398 学
19 20064 习
22 41 )补充:
byte:代表 UTF-8 编码中单个字节的值,是 uint8 类型的别名,占用一个字节
rune:代表单个 Unicode 字符,是 int32 类型的别名,占用4个字节