变量,数据类型,运算符,流程控制和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,whilebreak 和 continue都可用在for,while循环中

  • 多分支中使用if...elif...else...

  • python中直接条件后面跟冒号,换行缩进下写代码

  • python中for循环都是用关键字in一个可迭代对象或迭代器,后面跟冒号,换行缩进下写代码

ii. golang部分

  • golang的流程控制中有if,for,switch,gotobreak语句可以结束forswitchselect的代码块。continue语句仅限在for循环内使用
  • break 和 continue的后面都可以跟一个标签。标签要求必须定义在对应的forswitchselect的代码块上
  • break后面跟标签表示退出这个标签对应的代码块。continue后面跟标签表示结束当前循环开始标签对应的循环

1. if判断

  • 多分支中使用if...else if...else if...else...

  • Go语言规定与if匹配的左括号{必须与if的条件表达式放在同一行,{放在其他位置会触发编译错误。 同理,与else{也必须与else写在同一行,else还必须与上面一个ifelse 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循环可以通过breakgotoreturnpanic语句强制退出循环,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遍历的返回值有以下规律:

    1. 组、切片、字符串返回索引和值。
    2. map返回键和值。
    3. 通道(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

*/
posted @ 2019-12-02 21:39  BigSun丶  阅读(406)  评论(0)    收藏  举报