Golang-变量与基础数据类型、指针
Golang中的变量
声明变量
1 | var 变量名 变量类型 |
例:声明变量num的类型为int
1 | var num int |
使用关键字var和小括号,可以同时声明多个变量。
1 | var( |
初始化变量
每种类型的变量初始化后都会有对应的默认值:
- 整型和浮点型变量的默认值为0。
- 字符串变量的默认值为空字符串。
- 布尔型变量默认为false。
- 切片、映射、函数和指针变量默认为nil。
注意:nil相当于其他编程语言中的null、None和NULL等,指代零值,在Go语言中只能赋值给切片、映射、函数、接口、指针或通道类型。
1 | var 变量名 变量类型 = 表达式 |
例:声明变量num类型为int并赋值为1
1 | var num int = 1 |
在标准格式基础上,把变量类型省略后,编译器会根据等号右边的表达式推导变量的类型。
例:初始化变量age值为20
1 | var age = 20 |
同样会根据等号右边的表达式推导变量的类型。
1 | age := 30 |
多重赋值
1 | name, age := "Tom", 18 |
注意:在多重赋值时需要注意变量重复声明的情况
1 | var name string |
多个短变量声明并初始化时,至少要有一个新声明的变量出现在左值中
1 | var name string |
变量值交换
交换变量a和变量b的值
通过中间变量c进行交换
1 | package main |
通过多重赋值的特性,完成变量值的交换工作。
1 | package main |
匿名变量
赋值给多个变量时,如果存在不需要接收值的变量,可以使用匿名变量来代替。
1 | package main |
Golang中的基础数据类型
Go语言的数据类型十分丰富,常见的包括整型、浮点型、字符串和布尔型等。Go语言特有的数据类型包括接口和通道等。
整形主要分为有符有符号整型:int8、int16、int32、int64。号无符号两大类
- 有符号整型:int8、int16、int32、int64。
- 无符号整型:uint8、uint16、uint32、uint64。
有符号整型其二进制最高位储存符号,因此两者的区别就是无符号整型可以存放的正数范围比有符号整型中的正数范围大一倍。
例如:int16的范围为-32768(即-2^15)到32767(即2^15-1),uint16的范围为0到65535(即2^16-1)。
1 | //在Go语言中,对于两个整型变量的除法运算,小数部分将会直接被截取,只取整数部分,不会存在四舍五入的情况。 |
Go语言支持两种浮点数:float32和float64。float32浮点数的最大范围约为3.4e38,float64浮点数最大范围约为1.8e308。
用以下方式获取除法计算的精确值。
1 | package main |
代码所在计算机为64位系统, 我们通过赋值时带上小数点来告诉编译器该变量类型为float64,这样除法得到的结果也是float64类 型,即可以显示出精确结果。
Go语言中,字符串的值为双引号中的内容,而且可以直接输入中文。
1 | package main |
遇到输入多行字符串的情况,此时需要使用“`”字符,即反引号。
字符
字符串中的每个元素就是字符。 Go语言中,字符的值为单引号中的内容,而且可以直接输入中文。
字符有以下两种类型:
- uint8类型:代表了ASCII码的一个字符。
- rune类型:代表了UTF格式的一个字符(如中文、日文或其他复合字符),本质是int32类型。
1 | package main |
转义字符
使用反斜线“\”来对字符进行转义,转义字符具有特定的含义,不同于字符原有的意义,所以称为转义字符。
常见转义字符:
转义符 | 含义 |
---|---|
\n | 匹配换行符 |
\r | 匹配回车符 |
\t | 匹配制表符 |
\‘ | 匹配单引号 |
\“ | 匹配双引号 |
\\ | 匹配反斜杠 |
布尔型是最简单的数据类型,只有两个值:false(假)和true(真)。
1 | package main |
数据类型操作
如果需要判断变量的类型,可以使用Go语言标准库中的reflect包,通过将变量传入此包的 TypeOf()方法,得到变量的数据类型。
1 | package main |
Go语言常见的数据类型之间能够互相进行类型转换,通过使用类型前置加小括号的方式进行。
1 | package main |
注意⚠️:在转换变量类型时,需要注意变量原本的值是否会发生改变。
1 | package main |
由于16位有符号整型的范围为-32768~32767,而变量a的值1234567891不在这个范围内,导致变量a原本的值发生改变。
1234567891对应的十六进制为0x499602d3,转变为16位变量后,长度缩短一半,丢失了前(高)4位十六进制,即变为:0x02d3,其对应的十进制值为723。
Golang中的指针
概述:指针是一种地址值,这个地址值代表着计算机内存空间中的某个位置。指针变量就是存放地址值的变量
指针变量的声明格式如下:
1 | var 变量名 *int |
一般情况下,会将指针变量的类型声明为*int,变量名为“p”开头(指代“point”)的单 词,如“p”或“ptr”。
1 | package main |
Go语言中,使用操作符“&”取变量地址,取得的地址值可以赋给指针变量。
1 | package main |
由于指针变量本身也是变量,因此指针变量在计算机内存中也有自己的地址。需注意的是,运行上面时得到的实际结果可能与以上结果不符,多次运行该程序得到的结果可能都不一致,这是由于变量在内存中的位置都是随机分配的。
指针变量存储的值为地址值,通过在指针变量前面加上“*”符号可以获取指针所指向地址值 的内容。
1 | package main |
注意⚠️: p指针声明后其值为nil,这时如果获取指针p指向的地址内容,则会出错。
1 | package main |
在指针变量有实际指向的地址值后,可以通过如下格式直接修改指针所指向内存地址的内容:
1 | *变量名 =修改值 |
1 | package main |
在使用指针修改值时也需注意,可使用new()函数来给指针分配地址并初始化地址对应的值。
1 | package main |
Golang中的字符串操作
方法1:
Go语言的字符串拼接操作可以通过“+”操作符来完成
1 | package main |
方法2:
需要拼接的字符串较长时,使用“+”操作符进行字符串的拼接并不高效,使用字节缓冲的方式来进行。
1 | package main |
其中bytes包中的Buffer数据结构如下,其本质是字节数组,字符串本质上也是一种字节数组,可以通过WriteString()方法来写入。
1 | type Buffer struct { |
Go语言中的strings包的Index()方法会从头对字符串进行搜索,获得搜索内容所属下标,完成对字符串的截取。
1 | package main |
strings包中还提供了LastIndex()方法来反向搜索字符串。例如,我们只想截取字符串“Go语言,Python语言”中最后的“语言”,就可以使用LastIndex()方法。
1 | package main |
Go语言无法对字符串直接进行修改,只能将字符串转换为字节数组后再进行操作。
1 | package main |
对字符串的格式化使用fmt包的Sprintf()方法,Sprintf()方法的调用格式如下:
1 | Sprintf(format,arg1,arg2...) |
第一个参数为需要格式化的字符串,其中包含格式化动词,格式化动词以“%”开头。调用样例如下:
1 | package main |
格式化动词 | 动词功能 |
---|---|
%v | 按值的本来值输出 |
%+v | 在 %v 基础上,对结构体字段名和值进行展开 |
%#v | 输出 Go 语言语法格式的值 |
%T | 输出 Go 语言语法格式的类型和值 |
%% | 输出 % 本体 |
%b | 整型以二进制方式显示 |
%o | 整型以八进制方式显示 |
%d | 整型以十进制方式显示 |
%x | 整型以十六进制方式显示 |
%X | 整型以十六进制、字母大写方式显示 |
%U | Unicode 字符 |
%f | 浮点数 |
%p | 指针,以十六进制方式显示 |