美文网首页
C++程序员的go学习之路(1)——语法

C++程序员的go学习之路(1)——语法

作者: 丑角的晨歌 | 来源:发表于2018-08-07 20:54 被阅读0次

    (1) package、import、init函数

    • package跟import其实跟java里面的概念差不多,go的话保留了两个函数:init与main。
    • 每个package里可以写任意多个init,但从可读性的角度说,建议每个文件中只写一个init函数。同一个包中的多个init函数的执行顺序没有明确的说明。
    • init不能被其他函数调用,而是在main执行之前被自动调用。
    • 不同包的init函数根据包导入的依赖关系决定执行顺序,如下图。


    • 同一个包如果被其他包导入了多次,那么它只会导入一次。
    import(
    . "fmt"  //点的含义是你以后调用这个包的函数时可以省略包名
    )
    import(
    f "fmt"  // 别名,可以使用f.Println("hello world")
    )
    import (
    _ "github.com/somepackage"  // 只调用了该包的init函数,不使用包里面的函数
    )
    

    (2) 函数、变量声明、作用域

    // 声明函数:go中的函数可以返回多个变量
    func function_name([parameter list]) [return_types] {
      // 函数体
    }
    // 举例:
    func swap(x, y string) (string, string) {
      return y,x
    }
    
    var v_name v_type  // 指定变量类型
    var v_name = value  // 根据值自行判断类型
    v_name := value // 初始化声明,不能用于全局变量,此时左侧的变量不应该是已经声明过的
    // 也可以同时声明多个变量
    var vname1, vname2, vname3 type
    var vname1, vname2, vname3 = v1, v2, v3
    vname1, vname2, vname3 := v1, v2, v3
    
    var (
      vname1, v_type1
      vname2, v_type2
    )
    _ //空标记占位符,通过将函数返回值赋值给空标记,可以避免提示未使用的变量
    
    • 全局作用域:所有的关键字、内置类型、函数
    • package作用域:一个包中声明的变量、常量、函数、类型等在同一个包中可以任意访问
    • 文件作用域:一个文件中通过import导入的包名,只在当前文件有效
    • 函数作用域、for、if、{}自定义作用域:函数的参数返回值拥有函数作用域,for、if、{}内部的变量只拥有最小作用域

    (3) 流程控制

    if...else...
    其实跟C++基本一样,差别在括号可以省略,直接写成if a<20这样。不过你要习惯把括号加上也是没问题的;
    switch
    与C++差别在于每个case不需要加break,默认就会break;如果需要继续往下走的效果可以显式使用fallthrough;
    select
    这个语法与switch比较类似,每个case必须是一个通信操作,允许有default子句;一般用于让程序线程在多个channel的操作上等待,待以后详细了解channel后再学习;
    for
    有三种形式,与C语言的for一样,或者与C中的while一样,或者根据range遍历:
    for init; condition; post {}
    for condition {}
    for key,value := range {}
    break与continue等的使用也基本一致;

    (4) 类型转换

    type_name(expression)

    var sum int = 17;
    var count int = 5;
    var mean float32
    
    mean = float32(sum) / float32(count)
    

    (5) 指针

    基本同C
    注意go中的函数传参均为值传递,所以如果需要在函数内修改传入的变量的话就需要通过指针进行;
    虽然slice/map/channel等部分类型为引用类型,但是做为函数参数时仍为值传递,虽然也存在一些特殊之处。
    关于slice类型做为参数时情况的理解可见以下链接:
    https://blog.csdn.net/future_challenger/article/details/48438017
    https://www.jb51.net/article/136199.htm

    相关文章

      网友评论

          本文标题:C++程序员的go学习之路(1)——语法

          本文链接:https://www.haomeiwen.com/subject/utdtvftx.html