C++,Python,Go对照学习-02


main函数
        Go中有且只有一个main函数,而且main函数必须在package main当中.main函数无返回值也无参数,如果希望获取从命令行传递的参数有其他包解决这个问题.
        C++中main函数可以有参数也可以有返回值.而且声明的时候有返回值,在main函数体中可以不写,编译器会帮你补上.

        虽然Python中有类似main的东西,在代码中我们也可以看见if __name__ == '__main__': 这样的代码,但实质上Python就不需要main函数.当一个Python文件被当作可以直接

        运行的模块的时候,它的__name__属性将是一个特殊的默认值 __main__,仅此而已.


结构控制
先来说if
    Go中的if看起来是这样子的:
    if condition {   <-{是强制的,并且只能在这一行
        ...
    }
    从其表显示形式上看,不需要小括号把条件包起来,而且包含了一对必须的大括号.这样子看起来感觉就是C++和Python的合体.
    c++ code:
    if(condition){
        ...
    }
    Python code:
    if condition:

        ...

    Go中的if语句可以设置一个局部变量,这个变量的作用于仅限于if句块中.

    if err := chmod(777); err != nil {
        ...  //err的作用于就限定在这里面
    }

switch
    go中的switch比较灵活可以接受一个表达式,表达式不必局限于整形或者常量.也就是说即便是写出下面的语句也是可以的
    a := "aaa"
    switch {
    case "aaa" == a:
        fmt.Println("oooooo")
    }

    最终结果输出:oooooo


    go中的switch除了可以接受表达式之外还有一点和C++中switch有较大不同,那就是当匹配一个case之后就不会继续向下匹配,这看起来就像是C++中switch在匹配了一个case       之后跟着一个break一样.如果希望go中的switch在匹配一个case之后继续向下匹配则需要显示的加上fallthrough关键字.
    switch i {
    case 0:
    case 1:
    f()
    // 空的 case 体
    // 当 i == 0 时,f 不会被调用!
    }
    而这样:
    switch i {
    case 0:
    case 1:
    f()
    fallthrough
    // 当 i == 0 时,f 会被调用!
    }


    C++中switch智能接受整形,这也使得如果你想使用字符串,额这是没有办法实现的事.
    Python中根本没switch这货

循环
    go中循环只有for,不过for又有三种形式
    1. for init; condition; post{
          ...

        }

    这种形式相当于C++里面的for

2. for condition {
        ...
     }
    这种形式相当于c++中的while
3. for {
      ...
    }
    这种形式相当于C++中while(true)这样的死循环
    Python中的循环有for-in和while两种结构.其中for-in是一种范围迭代的循环,在C++11中亦有基于范围的for了. while的话大家基本都一样.

continue,break
    go中的continue,break都可以加上一个标签,实现不同的跳转动作.下面例子中有一个双层循环,外层循环5次,内层循环5次.
    func main() {
    Test:
        for i := 0; i < 5; i++ {
            for j := 0; j < 5; j++ {
                fmt.Println(i, j)
                if j == 2 {
                    continue Test
                }
             }
        }
    }
    结果输出:
    0 0
    0 1
    0 2
    1 0
    1 1
    1 2
    2 0
    2 1
    2 2
    3 0
    3 1
    3 2
    4 0
    4 1
    4 2

    修改代码改为
    func main() {
    Test:
        for i := 0; i < 5; i++ {
            for j := 0; j < 5; j++ {
                fmt.Println(i, j)
                if j == 2 {
                    break Test
                }
            }
       }
    }
    结果输出:
    0 0
    0 1
    0 2
    也就是说在go中,continue和break可以使用标签决定其略过某个循环的剩余部分或者跳出某个循环(多层嵌套),这使得在使用上变得更为灵活了.

goto
    好吧这部分又不关Python什么事,虽然有人以库的形式实现了Python中的goto,但这不在讨论范围内,有兴趣的可以移步http://entrian.com/goto/

    既然break和continue都可以加标签,那么go语言肯定是少不了goto语句的.我知道其实很多人对goto语句有着不理智的偏见.在go中goto语句和C++中的goto语句一致.

我们可以看到go中结构控制相较于C++和Python来说算是比较灵活比较简单的.