第二章 变量、常量和数据类型 (6)

原生的字符串字面值,用` `代替双引号。可用于编写正则表达式。常用于HTML模板、JSON面值、命令提示信息以及需要扩展到多行的场景。

tips := `请按要求执行以下操作:

 1 输入参数

 2 计算

 3 打印结果`

fmt.Println(tips)

 

 

6 UTF8编码

UTF8编码是一种字符编码,使用14个字节表示一个字符。ASCII部分字符只使用1个字节,常用字符部分使用23个字节。变长的编码无法直接通过索引来访问第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编码是6C496C490800-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相当于字符编码,即字典。utf8uft16是如何以字节的方式存储这个编码。字符串可比较、可遍历、不可修改。

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定义类型

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsfxs.html