原生的字符串字面值,用` `代替双引号。可用于编写正则表达式。常用于HTML模板、JSON面值、命令提示信息以及需要扩展到多行的场景。
tips := `请按要求执行以下操作:
1 输入参数
2 计算
3 打印结果`
fmt.Println(tips)
6 UTF8编码
UTF8编码是一种字符编码,使用1到4个字节表示一个字符。ASCII部分字符只使用1个字节,常用字符部分使用2或3个字节。变长的编码无法直接通过索引来访问第n个字符。
Go语言的源文件采用UTF8编码,unicode/utf8包提供提供了用于rune字符序列的UTF8编码和解码功能。如果关心每个unicode字符,可以使用UTF8解码器。unicode/utf8包括提供了该功能。
s := "hello 世界"
fmt.Println(len(s)) //12
fmt.Println(utf8.RuneCountInString(s))//8
将一个整数型转换为字符串意思是生成以只包含对应unicode编码字符的UFT8字符串,如果对应的编码的字符无效,将用‘\uFfFD’无效字符作为替换:
fmt.Println(string(65)) //"A"
fmt.Println(string(0x4eac)) //"京"
fmt.Println(string(12345678)) //无效字符
string 接受到[]rune的类型转换,可以将一个UTF8编码的字符串解码为unicode字符串序列:
s := "世界"
fmt.Printf("%x\n", s) //e4b896e7958c,utf8编码
r := []rune(s)
fmt.Printf("%x\n", r) //[4e16 754c],unicode编码
例如"汉"字的Unicode编码是6C49。6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码。
s := "汉"
fmt.Printf(" %x\n", s) // e6b189,UTF8编码
r := []rune(s)
fmt.Printf("%x\n", r) //[6c49],unicode编码
unicode相当于字符编码,即字典。utf8、uft16是如何以字节的方式存储这个编码。字符串可比较、可遍历、不可修改。
2.4指针 2.4.1 指针概念指针是一个类型,该类型的变量称为指针变量。指针变量存储一个变量的地址。它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。
2.4.2 声明指针变量
声明指针变量的一般形式如下:
var 变量名 *类型
例如:
var ip *int //指向int类型的变量
var fp *float32 //指向float32类型的变量
var ptr [MAX]*int;//指向数组的指针
指针操作注意事项:
默认值 nil,没有 NULL 常量。
操作符 "&" 取变量地址, "*" 通过过指针访问目标对象。
不⽀持指针运算,不⽀持 "->" 运算符,直接⽤ "." 访问目标成员
不能对指针做加减法等运算
不存在函数的指针
package main
import "fmt"
type Student struct {
Name string
Age int
}
func main() {
a := 10
b := 12.5
var pa *int = &a
var pb *float64 = &b
//1 打印变量的值
fmt.Printf("%v,%v\n", a, b)
fmt.Printf("%v,%v\n", *pa, *pb)
// 2 打印变量的地址
fmt.Printf("%v,%v\n", &a, &b)
fmt.Printf("%v,%v\n", pa, pb)
// 3 指针默认值为nil
var pc *int
fmt.Printf("%v,\n", pc)
// 4 通过指针访问对象成员
ps := &Student{"张三", 18}
fmt.Println(ps.Name, ps.Age)
}
2.4.3数组指针和指针数组
数组指针是只一个指针变量保存的是数组的地址。指针数组,是指数组的每个元素都是指针类型。
package main
import "fmt"
func main() {
var ptr *[3]int //数组指针
arr := [3]int{1, 2, 3}
ptr = &arr //保存了数组的地址
fmt.Println(*ptr)
var ptr2 [3]*int //指针数组,每一个元素都是指针
a, b, c := 10, 20, 30
ptr2[0] = &a
ptr2[1] = &b
ptr2[2] = &c
fmt.Println(ptr2) //ptr2数组中的3个指针分别保存了a,b,c的地址
}
// 打印结果:
[1 2 3]
[0xc04200a2c8 0xc04200a2e0 0xc04200a2e8]
2.4.4 二级指针(多级指针)
二级指针保存一级指针变量的地址。
package main
import "fmt"
func main() {
var a int = 100
var pa *int = &a
var ppa **int = &pa
//打印a的值
fmt.Printf("%v,%v,%v\n", a, *pa, **ppa)
//打印a的地址
fmt.Printf("%v,%v,%v", &a, pa, *ppa)
}
//打印结果:
100,100,100
0xc0420401d0,0xc0420401d0,0xc0420401d0
2.5 type定义类型