美文网首页
2. Go 基本概念

2. Go 基本概念

作者: PRE_ZHY | 来源:发表于2018-09-12 13:10 被阅读1次

    名称

    Go 语言中所有的函数、变量、常量、类型、语句和包名称都遵循一个简单的规则,即名称的开头是一个字母(Unicode即可)或下划线,后面可跟任意数量的字符、数字和下划线。注意 Go 对所有名称的大小写都敏感的。当然总有例外,那就是下面的这些名称。

    Go 关键字
    break default func interface select
    case defer go map struct
    chan else goto package switch
    const fallthrough if range type
    continue for import return var

    Go 关键字,Go为这些关键字保留了使用权力,你无权使用。

    内置函数 : append , cap , close , len, make , new , copy , delete
    complex, real, imag
    panic,recover
    内置类型:complex64complex128float32float64intint8int16int32int64int128unitunit8uint16uint32uint128, bool, byte, string, rune, error
    内置常量: true ,false , iotanil

    Go 中 几十个内置预声明的常量、类型和函数名称用于特定用途,除非你知道你在干什么,否则不要随意命令上面的名称。

    名称本身并没有好坏之分,只要清楚用途即可,如果将 x1 = 温度值, x2 = 湿度值, x3 = 照度值,也是可以,但是你要时刻记得他们谁是谁,否则你就最好使命名有意义。Go喜欢驼峰式名称,用于区别不同单词或动作,如GetNumber(),但对于约定简写,全部大写可能会更好一些。

    声明变量、常量及类型

    声明就是给一段程序或变量一个名字,使其容易区别、引用和查找。声明可以声明包、函数、类型、变量和常量,包和函数的声明后文再说。

    在同一作用域内(什么是作用域,后面一点再谈,暂时可以理解为一个文件范围,或一个{} 体内),声明的变量或常量或其他是不分前后顺序的,但声明不能在调用后发生,否则不能称其为声明。包级别声明,在全包范围内可见,局部声明则仅在局部范围可见。

    变量

    var 声明创建一个具体类型的变量,然后给它附加一个名字,设置初始值,如果没有初始值,那么 Go 会给它默认初值,在 Go 中,只要声明的变量调用就是安全的,全为其类型的“零”值。

    var varname type = express
    var height int = 20 // 声明一个身高变量,并赋给初值 20
    var age int = 20 // 声明一个年龄变量,不赋给初值,Go 默认初始化为0

    也可以进行多个变量的一起声明

    var i, j, k float32 声明一组坐标的变量
    var i, j, k float32 = 1.0 2.0 3.0 声明一组坐标,并同时初始化

    当然声明的是基本类型,可以利用 Go 的类型推断,省略变量类型

    var i, j, k = 1.0, 2.0, 3.0 #

    上述表达也是 ok 的,Go 会利用右端的值推断左端变量的类型,但是由于 数值上 1.0 == 1, 如果你略去 float32,i, j, k 也可能推断为 int 类型,对于计算造成一定不可见问题。但对于没有歧义的地方,例如字符串string,则是一种偷懒的好办法。

        var i, j, k = 1, 2, 3
        fmt.Printf("i / j = %f, i / k = %f \n", float32(i/j), float32(i/k))
        var x, y, z = 1.0, 2.0, 3.0
        fmt.Printf("x / y = %f, x / z = %f \n", float32(x/y), float32(x/z))
        /*
        i / j = 0.000000, i / k = 0.000000
       x / y = 0.500000, x / z = 0.333333
       */
    

    想在同一行语句中声明不同的变量,也可以,可以声明如下格式。也可以通过返回值类型确定变量类型。

    var (
      name = "Jack"
      age int = 20
      height float32 = 1.8
    )
    var f, err = os.Open("HelloWorld.go")
    

    如前所说,Go 还有一种短变量声明,这种声明方式一般都都带有初始化(即利用自动推断初始化变量,否则 Go 不知道变量类型,没有办法分配变量空间)

    name, age, height := "Jack", 20, 1.80
    freq = rand.Float64() * 3.0
    f, err :=  os.Open("HelloWorld.go")
    // 错误的一种 f, err =  os.Open("HelloWorld.go"),既没有前面加关键字 var 也没有利用简短声明标识 := ,
    那么就是未声明就直接赋值,什么后果……,后果就是编译不通过,提示未定义的变量,然后再去补上喽。
    

    只要有未声明的变量,就应该使用 := 声明。已经声明的变量,赋值的时候就必须按照声明的类型去赋值,否则一定会提示出错,除非……没有除非。

    一个包级别的全局变量存在于程序的整个声明周期,一个局部变量,一般在执行该局部时生成,该局部运行结束,则消亡;特殊的。当有其他变量引用到该变量时,则该变量存活。

    变量声明初始化之后,赋值就是利用 = 进行了,例如刚刚的 name = "Xiaoming", age = 12, height = 1.3 ,也可以进行多重赋值,如 name, age, height = "Xiaoming, 12, 1.3" 但必须保证等号两端个数一样多,类型相同。相比于 C 语言交换两个数的考验,这种特性保证可以交换成功,x, y = y, x

    常量

    常量是什么,常量一旦声明就不能变量的量,所以常量必须在编译时是确定下来。除此以外,常量和变量就几乎没有区别了,除了常量使用的是 const 来声明,而变量使用 var 来声明,其他模式均一致。

    const pi = 3.14159265358979323846 // 我只会背到这里了
    const (
      a = 1 + 1
      b       // b会默认使用a的类型及值
      c = 2
    )
    

    类型

    类型的声明,是通过 type 进行的,声明的新类型和某一个已有类型使用相同的底层类型。

    type name underlying-type

    为什么底层相同,上层要不一样呢,其实是为了怕混淆不同类型的数据。例如,1 RMB 和 1 USD 两者数值相等,等所拥有的价值完全不一样,为了不让他们混淆,那么就需要将两者区别开。

    type RMB int
    type USD int 
    var mywallet RMB = 20
    var yourwallet USD = 20
    fmt.Println(mywallet == youwallet) 
    // 编译失败,两种类型底层相同,但不能直接比较,想要比较必须进行显式的转换
    //例如,func RMB2USD(yuan RMB) USD { return USD(6*yuan)} 
    // 我不清楚今天汇率,麻烦自己查一下
    

    相关文章

      网友评论

          本文标题:2. Go 基本概念

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