目 录CONTENT

文章目录

Go学习系列03-变量

cplinux98
2022-09-12 / 0 评论 / 0 点赞 / 140 阅读 / 2,857 字 / 正在检测是否收录...

什么是变量

变量是用来存储一段或多端数据的。

举例

在编程中,代码在运行时都是在内存中的,比如我们想要设置一个值为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
  • 变量名、函数名、常量名采用驼峰法
  • 如果变量名、函数名、常量名首字母大写,则可以被其他的包访问
  • 如果首字母小写,则只能 在本包中使用

保留关键字

image-20220911225746359

系统的预定义标识符

image-20220911225801648

变量的取址

这里的取址指的是变量的内存引用地址,可以使用&来获取

func main() {
	hello := "Hello World"
	fmt.Println(&hello)
}
# 0xc000066250

变量的输入和输出

这里使用标准库"fmt"

Package fmt - The Go Programming Language (google.cn)

  • 使用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
    • 只有花括号内部可以访问
    • 如果内部变量和外部变量冲突,以内部位准
0

评论区