这篇文章主要介绍Golang的基本语法。希望在阅读了这篇文章之后你一定会对如何使用基本的语法有更深的了解。
本文介绍了Golang的变量与数据类型、运算符与流程控制的内容
-
变量与数据类型
变量
(以变量年龄age为例)
变量的声明 var age int
(没有写变量类型则根据值自动判断类型)
变量的赋值 age = 20
变量的使用fmt.Println("age=",age)
(没有赋值则使用默认值)
同时声明和赋值 var age int = 18
使用:=省略var定义赋值变量 age := 18
一次为多个变量进行声明 var age1,age2,age3 int
或者如 var n1,name,n2 = 1,"lucy",2.33 对不同类型变量进行赋值
//注意不能重复定义 不能赋与类型不匹配的值 在{}内的变量叫做局部变量 在函数外的变量叫做全局变量
golang数据类型
| 基本数据类型 | 派生数据类型/复杂数据类型 |
|---|---|
| 数值型 字符型 布尔型 字符串 | 指针 数组 结构体 管道 函数 切片 接口 map |
数值型
整数型
有符号整数类型:
| 类型 | 占用存储空间 | 表数范围 |
|---|---|---|
| int8 | 1byte | -2^7~2^7-1 |
| int16 | 2byte | -2^15~2^15-1 |
| int32 | 4byte | -2^31~2^31-1 |
| int64 | 8byte | -2^63~2^63-1 |
无符号整数类型
| 类型 | 占用存储空间 | 表数范围 |
|---|---|---|
| uint8 | 1byte | 0~2^8-1 |
| uint16 | 2byte | 0~2^16-1 |
| uint32 | 4byte | 0~2^32-1 |
| uint64 | 8byte | 0~2^64-1 |
其他整数类型
| 类型 | 有无符号 | 占用存储空间 | 表数范围 |
|---|---|---|---|
| int | 有 | 32位系统 4byte 64位系统 8byte | -2^31~2^31-1 / -2^63 ~2^63-1 |
| uint | 无 | 32位系统 4byte 64位系统 8byte | 0~2^32-1 / 0 ~2^64-1 |
| rune | 有 | 等价int32 | -2^31~2^31-1 |
| byte | 无 | 等价uint8 | 0~2^8-1 |
//golang的整数类型,默认声明为int型
//printf函数函数可以将变量格式化,将变量类型填充到%T的位置上
//导入unsafe包可以使用如下语句查看变量占用的字节数:fmt.Println(unsafe.sizeof(变量名称))
Go整数类型的选用规则:保小不保大,即在保证程序不出错的情况下,尽量选择占用空间小的类型
浮点型
简单来说,浮点型就是用来存放小数值
| 类型 | 占用存储空间 |
|---|---|
| float32 | 4byte |
| float64 | 8byte |
//既可以表示正浮点数,也可以表示负浮点数
//golang中默认的浮点类型为float64
-
运算符
- 算术运算符
加号+ :(1 表示正数 (2 相加操作 (3 字符串拼接
除号/ :(1 两个int类型数据运算结果一定为int类型 (2 浮点类型参与运算,结果为浮点类型
取模% :等价公式:a%b=a-a/b*b
自增/自减 ++/-- (1 在go语言中,++/--仅仅代表简单的加一/减一,只能单独使用,不能参与到运算中去 (2 在go语言中,++/--只能在变量的后面,不能在变量的前面
- 赋值运算符
(1 =号将右边表达式计算清楚后赋值给左边 (2 +=号将右边数值与左边数值相加后赋值给左边 (3 -=、*=、/=、%=与+=同理
- 关系运算符
== / =! / > / < / >= / <=
(1 关系运算符的结果都是bool型,即结果要么为true要么为false
(2 ==判断左右两侧值是否相等
!=判断是否不相等
3)> / < / >= / <= 大于/小于/大于等于/小于等于
- 逻辑运算符
&& / ||
(1 && 与逻辑所连接的两个数值/表达式只要有一侧是false,则结果一定为false
(2 || 或逻辑所连接的两个数值/表达式只要有一侧是true,则结果一定为true
(3 ! 非逻辑,取相反的结果
-
流程控制
流程控制的作用:
用来控制流程中各语句的执行顺序,使得语句组合成为能够执行一定功能的逻辑模块。
流程控制的分类:
顺序结构: "先执行...,再执行... " 依次执行的逻辑
条件判断结构 :"如果...,则..."的逻辑
循环结构:"如果...,则再次..."的逻辑
if
if单分支
基本语法 :
if 条件表达式{
逻辑代码
}
当逻辑代码表达式为true时,就会执行逻辑代码。//条件表达式可以不写括号,而且也建议不写括号。if和表达式之间必须要有空格。if语句{}必须使用。
if双分支
基本语法:
if 条件表达式{
逻辑代码1
}else{
逻辑代码2
}
if多分支
if多分支如果走了某一个分支,则不会再去判断执行剩余分支
以给学生成绩分类为例:score>=90,grade:A;score>=80,grade:B;score>=70,grade:C;score>=60,grade:D;score<60,grade:E;
代码示例:
if score >= 90{
fmt.Println("A")
}else if score >= 80{
fmt.Println("B")
}else if score >= 70{
fmt.Println("C")
}else if score >= 60{
fmt.Println("D")
}else{
fmt.Println("E")
}
switch
switch分支
基本语法:
switch 表达式{
case值1,值2,...:
语句块1
case值3,值4,...:
语句块2
default:
语句块
}
//注意事项: (1) switch后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
(2) case后面的表达式如果是常量值(字面量),则要求不能重复
(3) case后的各个值的数据类型,必须和switch的表达式数据类型一致
(4) case后面可以带多个值,使用逗号间隔。比如case值1,值2⒉...
(5) case后面不需要带break
(6) default语句不是必须的,位置也是随意的。
(7) switch后也可以不带表达式,当做if分支来使用
(8) switch后也可以直接声明/定义一个变量,分号结束,不推荐
(9) switch穿透,利用fallthrough关键字,如果在case语句块后增加falthrough ,则会继续执行下一个case,也叫switch穿透。
for
for循环
for 初始表达式;布尔表达式(条件判断);迭代因子{
循环体;
}
//for循环的初始表达式不能用var定义变量;要用:=来定义
for循环流程图
graph TD
初始化部分 --> 条件判断
条件判断 -->判定为假-->结束循环
条件判断 -->判定为真-->循环体 -->执行迭代因子 --> 条件判断