变量,数据类型,运算符,流程控制和python中的对比
目录
一、变量
1. 相同的部分
- 都只能由数字、字母、下划线组成变量名
2. 不同的部分
(1)python
- python中的常量只是一种习惯,可以改变
- python的变量名不能只是以数字开头就行
- python的变量声明直接是:
变量名 = 变量值
(2)golang
- golang中的常量不能改变,定义常量:
const pi = 3.1415
- golang的变量名叫做标识符,只能以字母或下划线开头
- golang的变量声明要以
var
开头并且指定变量的类型:var 变量名 变量类型
或var 变量名 类型 = 表达式
二、基本数据类型
1. 相同的部分
- 都有整型,浮点型,字符串,布尔类型
- python中的列表就是golang中的一维数组
2. 不同的部分
(1)python
- python中有独自的列表、元组、字典、集合
- python中布尔值为首字母大写
(2)golang
- golang中有独自的复数类型,byte和rune类型,二维、三维数组
- golang中布尔值为全小写
三、运算符
1. 相同的部分
-
都有算术运算符,逻辑运算符,位运算符,赋值运算符
-
golang中的关系运算符就是python中的比较运算符
2. 不同的部分
- python中多了一个成员运算符,即
in
四、流程控制
1. 相同的部分
- 都有
if
判断,且都有单分支和多分支结构 - 都有
for
循环 - 都有
break,continue
,他们的作用在python和golang中都是相同,只是用法上有点差别
2. 不同的部分
i. python部分
-
python的流程控制中有
if,for,while
,break 和 continue
都可用在for,while
循环中 -
多分支中使用
if...elif...else...
, -
python中直接条件后面跟冒号,换行缩进下写代码
-
python中for循环都是用关键字
in
一个可迭代对象或迭代器,后面跟冒号,换行缩进下写代码
ii. golang部分
- golang的流程控制中有
if,for,switch,goto
,break
语句可以结束for
、switch
和select
的代码块。continue
语句仅限在for
循环内使用 break 和 continue
的后面都可以跟一个标签。标签要求必须定义在对应的for
、switch
和select
的代码块上break
后面跟标签表示退出这个标签对应的代码块。continue
后面跟标签表示结束当前循环开始标签对应的循环
1. if
判断
-
多分支中使用
if...else if...else if...else...
-
Go语言规定与
if
匹配的左括号{
必须与if的条件表达式
放在同一行,{
放在其他位置会触发编译错误。 同理,与else
的{
也必须与else
写在同一行,else
还必须与上面一个if
或else if
的右大括号在同一行- 基本语法
基本语法,格式必须这样写: // 单分支判断 if 条件表达式 { // 代码块 } // 多分支判断 if 条件表达式1 { // 条件和 { 写在同一行 // 代码块 } else if 条件表达式2 { // 条件和 { 写在同一行,且和前面一个判断结尾的 } 写在同一行 } else { }
- 实例
1. 基本if判断 func ifDemo1() { score := 65 if score >= 90 { fmt.Println("A") } else if score >= 75 { fmt.Println("B") } else { fmt.Println("C") } } 2. if判断特殊写法(在 if 表达式之前添加一个执行语句,再根据变量值进行判断) func ifDemo2() { if score := 65; score >= 90 { fmt.Println("A") } else if score >= 75 { fmt.Println("B") } else { fmt.Println("C") } }
2. for
循环
-
Go 语言中的所有循环类型均可以使用
for
关键字来完成,包括无限循环。 -
for循环可以通过
break
、goto
、return
、panic
语句强制退出循环,continue
跳出当前循环,break、continue
的作用和python中是一样的- 实例
// for循环的基本格式如下: for 初始语句;条件表达式;结束语句{ 循环体语句 } // 1. for循环普通写法 func forDemo() { for i := 0; i < 10; i++ { fmt.Println(i) } } // 2. for循环的初始语句可以被忽略,但是此时初始语句后的分号必须要写 func forDemo2() { i := 0 for ; i < 10; i++ { fmt.Println(i) } } // 3. for循环的初始语句和结束语句都可以省略,例如: func forDemo3() { i := 0 for i < 10 { fmt.Println(i) i++ } } // 4. 同时声明多个条件变量 func forDemo4() { for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 { fmt.Printf("%d * %d = %d\n", no, i, no*i) } } // 打印结果 10 * 1 = 10 11 * 2 = 22 12 * 3 = 36 13 * 4 = 52 14 * 5 = 70 15 * 6 = 90 16 * 7 = 112 17 * 8 = 136 18 * 9 = 162 19 * 10 = 190 // 5. 无限循环 for { 循环体语句 }
3. for range
键值循环
-
for range
的作用和python中的enumerate
方法作用相同。 -
Go语言中可以使用
for range
遍历数组、切片、字符串、map 及通道(channel)。 通过for range
遍历的返回值有以下规律:- 组、切片、字符串返回索引和值。
- map返回键和值。
- 通道(channel)只返回通道内的值。
-
实例
func main() {
var a = [...]string{"北京","上海", "深圳"}
for index, value := range a {
fmt.Println(index, value)
}
}
4. switch case
- 使用
switch
语句可方便地对大量的值进行条件判断,被认为是替代多分支if else
的常用方式 - 所有
case
中的条件不允许出现重复项 - Go语言规定每个
switch
只能有一个default
分支,default
相当于else
的意思,default
分支不是必须写上的
(1)基本语法
1. 第一种
初始语句
switch 表达式 {
case 条件表达式1:
// 代码块1
case 条件表达式2:
// 代码块2
...
default:
// 代码块2
}
2. 第二种
switch 初始语句;表达式 {
case 条件表达式1:
// 代码块1
case 条件表达式2:
// 代码块2
...
default:
// 代码块2
}
// 实例:
// switch case 第一种
func switchDemo1() {
finger := 3
switch finger {
case 1:
fmt.Println("大拇指")
case 2:
fmt.Println("食指")
case 3:
fmt.Println("中指")
case 4:
fmt.Println("无名指")
default:
fmt.Println("无效的输入!")
}
}
// switch case 第二种
func switchDemo2() {
switch finger := 3;finger {
case 1:
fmt.Println("大拇指")
case 2:
fmt.Println("食指")
case 3:
fmt.Println("中指")
case 4:
fmt.Println("无名指")
default:
fmt.Println("无效的输入!")
}
}
// 在上述程序中,switch finger 将 finger 的值与每个 case 语句进行比较。通过从上到下对每一个值进行对比,并执行与选项值匹配的第一个逻辑,所以执行后会打印 中指
(2)case 一个分支中多值
// switch case 一个分支有多个值
func switchDemo3() {
switch n := 7; n {
case 1, 3, 5, 7, 9:
fmt.Println("奇数")
case 2, 4, 6, 8:
fmt.Println("偶数")
default:
fmt.Println(n)
}
}
(3)case 分支中使用表达式
// 分支还可以使用表达式,这时候switch语句后面不需要再跟判断变量
// 这种类型的 switch 语句可以替代多个 if else 子句
func switchDemo4() {
age := 30
switch { // switch 后面不能跟 age 了
case age <= 25:
fmt.Println("好好学习吧")
case age > 25 && age < 35:
fmt.Println("好好工作吧")
case age >= 60:
fmt.Println("好好享受吧")
default:
fmt.Println("活着真好")
}
}
(4)fallthrough
关键字用法
// fallthrough语法可以执行满足条件的case的下一个case(和下一个case的条件无关,直接执行其内部的代码块),是为了兼容C语言中的case设计的
func switchDemo5() {
s := "a"
switch {
case s == "a":
fmt.Println("a")
fallthrough
case s == "b":
fmt.Println("b")
case s == "c":
fmt.Println("c")
default:
fmt.Println("...")
}
}
// 输出:
a
b
5. goto
-
goto
语句通过标签进行代码间的无条件跳转。 -
goto
语句可以在快速跳出循环、避免重复退出上有一定的帮助 -
Go语言中使用
goto
语句能简化一些代码的实现过程 -
实例
// 例如普通写法的双层嵌套的for循环要退出时: func gotoDemo1() { var breakFlag bool for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { if j == 2 { // 设置退出标签 breakFlag = true break } fmt.Printf("%v-%v\n", i, j) } // 外层for循环判断 if breakFlag { break } } } // 使用goto语句能简化代码: func gotoDemo2() { for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { if j == 2 { // 设置退出标签 goto breakTag } fmt.Printf("%v-%v\n", i, j) } } // 标签 breakTag: fmt.Println("结束for循环") }
6. break 和 continue
实例
1. break 实例
func breakDemo1() {
BREAKDEMO1:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
break BREAKDEMO1
}
fmt.Printf("%v-%v\n", i, j)
}
}
fmt.Println("...")
}
/*
break BREAKDEMO1 标签表示第一次j等于2时,结束所有的for循环
打印结果:
0-0
0-1
...
*/
2. continue 实例1
func continueDemo1() {
forloop1:
for i := 0; i < 5; i++ {
// forloop2:
for j := 0; j < 5; j++ {
if i == 2 && j == 2 {
continue forloop1
// continue forloop2
}
fmt.Printf("%v-%v\n", i, j)
}
}
}
/*
continue forloop1 标签表示结束i等于2时,j的3,4部分的循环,所以没有打印 2-2 2-3 2-4
打印结果:
0-0
0-1
0-2
0-3
0-4
1-0
1-1
1-2
1-3
1-4
2-0
2-1
3-0
3-1
3-2
3-3
3-4
4-0
4-1
4-2
4-3
4-4
*/
3. continue 实例2
func continueDemo2() {
//forloop1:
for i := 0; i < 5; i++ {
forloop2:
for j := 0; j < 5; j++ {
if i == 2 && j == 2 {
// continue forloop1
continue forloop2
}
fmt.Printf("%v-%v\n", i, j)
}
}
}
/*
continue forloop2 标签表示结束i等于2,j等于2时的循环,所以没有打印 2-2
打印结果:
0-0
0-1
0-2
0-3
0-4
1-0
1-1
1-2
1-3
1-4
2-0
2-1
2-3
2-4
3-0
3-1
3-2
3-3
3-4
4-0
4-1
4-2
4-3
4-4
*/