什么是变量
变量是用来存储一段或多端数据的。
举例
在编程中,代码在运行时都是在内存中的,比如我们想要设置一个值为200,在内存中的地址就是0x00010001,当我们想要多次使用的时候,肯定不能直接在每个地方都写200,这样要修改的时候就很麻烦了,我们可以让一个‘字符’来‘存储’200这个值,在应用值的地方用‘字符’来替代,这样就很方便修改了。
变量的名字就是我们代替使用的字符
,变量的值就是200
,实际上字符对应的是内存地址,而不是真实的值。
变量声明
Go语言是静态类型的语言,所以变量是有明确类型的。
Go语言中变量声明后必须要使用,如果没有使用,会在编辑的时候就给出提示。
变量类型
Go语言的基本变量类型有:
基础数据类型
类型关键字 | 说明 | 备注 |
---|---|---|
bool | 布尔值 | |
int、int8、int16、int32、int64 | 整型 | 后面的数字位数,8Bit(位)= 1Bytes(字节),位数越高存储的数字越大,没有带数字的取决于当前操作系统位数(32位系统等于int32) |
uint、uint8、uint16、uint32、uint64 | 无符号整型 | 同上 |
byte | 字节 | uint8的别名 |
rune | int32的别名,代表一个Unicode码 | |
float32、float64 | 浮点数 | 后面的数字位数,8Bit(位)= 1Bytes(字节),位数越高精度越高 |
complex64、complex128 | 复数 | 后面的数字位数,8Bit(位)= 1Bytes(字节) |
uintptr | 整型 | 存储指针的uint32或uint64整数 |
复合数据类型
类型关键字 | 说明 | 备注 |
---|---|---|
array | 数组 | 类似于python中的list,但有长度限制 |
struct | 结构体 | |
string | 字符串 | |
slice | 切片 | 这个才是等于python中的list或者js中的array |
map | 集合 | 类似于python中的dict或者js中的object,map是无序的 |
channel | 管道 | |
interface | 接口 | |
function | 函数 | 类似于python中的def或js中的func |
变量命名规则
变量规则遵循”驼峰命名法“:首个单词小写,后面每个新单词首字母大写,例如:numShips和startDate
变量的默认值
类型关键字 | 说明 | 长度(字节) | 默认值 |
---|---|---|---|
bool | 布尔值 | 1 | false |
string | 字符串 | “” | |
int | 整型 | 4或8(根据操作系统位数决定) | 0 |
uint | 无符号整型 | 4或8(根据操作系统位数决定) | 0 |
int8 | 整型 | 1 | 0 |
uint8 | 无符号整型 | 1 | 0 |
int16 | 整型 | 2 | 0 |
uint16 | 无符号整型 | 2 | 0 |
int32 | 整型 | 4 | 0 |
uint32 | 无符号整型 | 4 | 0 |
int64 | 整型 | 8 | 0 |
uint64 | 无符号整型 | 8 | 0 |
byte | =uint8 | ||
rune | =int32 | ||
float32 | 浮点数 | 4 | 0.0 |
float64 | 浮点数 | 8 | 0.0 |
complex64 | 复数 | 8 | |
complex128 | 复数 | 16 | |
uintptr | 4或8(取决于操作系统位数) | 0 | |
array | 数组 | 根据初始化给定为准 | 取每个元素对应类型的默认值 |
struct | 结构体 | 取每个成员变量对应类型的默认值 | |
slice | 切片 | nil | |
map | nil | ||
channel | 管道 | nil | |
interface | 接口 | nil | |
function | 函数 | nil |
nil类似于python中的None或js中的null,代表“无”的意思
变量初始化
标准格式
var 变量名 变量类型
批量格式
var (
变量名1 变量类型1
变量名2 变量类型2
变量名3 变量类型3
...
)
简短格式
可以在定义时顺带设置初始化值,但只能用在函数内部。
此时不用给变量设置类型,因为这时候的类型是go语言根据值来推导出来的。
同一个作用域内被var声明过的变量,不可以再被简短格式声明并赋值
报错提示:no new variables on left side of :=
变量名 := 变量值/表达式
# 设置一组
变量名1, 变量名2 := 变量值1, 变量值2
变量赋值
变量 = 值/表达式
# 或者直接使用简短格式边初始化边赋值
变量名 := 变量值/表达式
匿名变量
_
就是匿名变量,任何赋给这个标识符的值都将被抛弃。
匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。
当我们在使用变量接收或定义多个变量时,不需要的变量可以使用它来丢弃。
_, i, _ , j := 1, 2, 3, 4
标识符
- Golang 对各种变量、方法、函数等命名时使用的字符序列称为标识符
- 凡是自己可以起名字的地方都叫标识符
标识符的命名规则
- 由 26 个英文字母大小写,0-9 ,_ 组成
- 数字不可以开头
- Golang 中严格区分大小写
- 标识符不能包含空格
- 下划线"_"本身在 Go 中是一个特殊的标识符,称为空标识符。可以代表任何其它的标识符,但 是它对应的值会被忽略(比如:忽略某个返回值)。所以仅能被作为占位符使用,不能作为标识符使用
- 不能以系统保留关键字作为标识符(一共有 25 个),比如 break,if 等等…
- 命名包名时:保持 package 的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,不要和 标准库不要冲突 fmt
- 变量名、函数名、常量名采用驼峰法
- 如果变量名、函数名、常量名首字母大写,则可以被其他的包访问
- 如果首字母小写,则只能 在本包中使用
保留关键字
系统的预定义标识符
变量的取址
这里的取址指的是变量的内存引用地址,可以使用&
来获取
func main() {
hello := "Hello World"
fmt.Println(&hello)
}
# 0xc000066250
变量的输入和输出
这里使用标准库"fmt"
- 使用fmt包里面的print系列函数进行变量的输出
- 使用fmt包里面的scan系列函数进行变量的输入
fmt中的输出格式化
fmt中的fmt.Printf
可以格式化变量的输出,按照以下格式可以输出想要的内容,有多个时,会按照顺序传递变量。
格式 | 含义 | 对应类型 |
---|---|---|
%% | 一个%字面量 | |
%b | 一个二进制整数值(基数为2),或者是一个(高级的)用科学计数法表示的指数为2的浮点数 | |
%c | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 | |
%d | 一个十进制数值(基数为10) | int系列 |
%f | 以标准记数法表示的浮点数或者复数值 | 浮点数 |
%o | 一个以八进制表示的数字(基数为8) | |
%p | 以十六进制(基数为16)表示的一个值的地址,前缀为0x,字母使用小写的a-f表示 | |
%q | 使用Go语法以及必须时使用转义,以双引号括起来的字符串或者字节切片[]byte,或者是以单引号括起来的数字 | |
%s | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以’\0‘结尾,这个’\0’即空字符) | 字符串 |
%t | 以true或者false输出的布尔值 | |
%T | 使用Go语法输出的值的类型 | |
%x | 以十六进制表示的整型值(基数为十六),数字a-f使用小写表示 | |
%X | 以十六进制表示的整型值(基数为十六),数字A-F使用小写表示 | |
%v | 默认格式的值,打印结构时,加号标志(%+v)会添加字段名 | |
%#v | 使用go语法打印值 |
变量运算
算术运算符
运算符 | 描述 |
---|---|
+ | 相加 |
- | 相减 |
* | 相乘 |
/ | 除 |
% | 求余 |
关系运算符
运算符 | 描述 |
---|---|
== | 检查2个值是否相等,如果相等返回True,否则返回False |
!= | 检查2个值是否不相等,不相等返回True,否则返回False |
> | 检查左边值是否大于右边值,如果是返回True,否则返回False |
>= | 检查左边值是否大于或等于右边值,如果是返回True,否则返回False |
< | 检查左边值是否小于右边值,如果是返回True,否则返回False |
<= | 检查左边值是否小于或等于右边值,如果是返回True,否则返回False |
逻辑运算符
运算符 | 描述 |
---|---|
&& | 逻辑and运算符,如果两边都是True,则整体为True,否则为False |
|| | 逻辑or运算符,如果两边有一个True,则整体为True,否则为False |
! | 逻辑not运算符,如果条件为True,则整体为False,否则为True |
位运算符
运算符 | 描述 |
---|---|
& | 参与运算的两数各对应的二进制相与(两位均为1才为1) |
| | 参与运算的两数各对应的二进制相或(两位有一个为1就为1) |
^ | 参与运算的两数各对应的二进制相异或,当两对应的二进制相异时,结果为1;作为一元运算符时表示按位取反,符号位也跟着变动 |
<< | 左移n位就是乘以2的n次方。a<<b是把a的各位二进制全部左移b位,高位丢弃,低位补0 |
>> | 右移n位就是除以2的n次方。a>>b是把a的各位二进制全部右移b位 |
赋值运算符
运算符 | 描述 |
---|---|
= | 简单的赋值运算符,将一个表达式的值赋给一个左值 |
+= | 相加后再赋值 |
-= | 相减后再赋值 |
*= | 相乘后再赋值 |
/= | 相除后再赋值 |
%= | 求余后再赋值 |
<<= | 左移后再赋值 |
>>= | 右移后再赋值 |
&= | 按位与后再赋值 |
|= | 按位或后再赋值 |
^= | 按位异或后再赋值 |
变量的作用域
在go语言中,变量是有作用域限制的,不同作用域非导出(大写开头)不能访问。
// 在代码中顶格声明
var (
A = 3
b = 4
)
- A
- 全局变量,大写字母开头就是,所有地方都可以访问,跨package访问时需要带上package名称
- b
- 全局变量,小写字母开头,只有本package可以访问
// 在函数中声明
func foo(){
b := 5
{
b := 6
}
}
- 第一个b
- 局部变量,只有在本函数内可以访问
- 如果内部变量和外部变量冲突,以内部位准
- 第二个b
- 只有花括号内部可以访问
- 如果内部变量和外部变量冲突,以内部位准
评论区