• Go 变量命名规则


    3. 变量

    变量是什么

    变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值。在 Go 中,有多种语法用于声明变量。

    声明单个变量

    var name type 是声明单个变量的语法。

    Copy
    package main
    
    import "fmt"
    
    func main() {
        var age int // 变量声明
        fmt.Println("my age is", age)
    }
    

    语句 var age int 声明了一个 int 类型的变量,名字为 age。我们还没有给该变量赋值。如果变量未被赋值,Go 会自动地将其初始化,赋值该变量类型的零值(Zero Value)。本例中 age 就被赋值为 0。如果你运行该程序,你会看到如下输出:

    Copy
    my age is 0
    

    变量可以赋值为本类型的任何值。上一程序中的 age 可以赋值为任何整型值(Integer Value)。

    Copy
    package main
    
    import "fmt"
    
    func main() {
        var age int // 变量声明
        fmt.Println("my age is", age)
        age = 29 // 赋值
        fmt.Println("my age is", age)
        age = 54 // 赋值
        fmt.Println("my new age is", age)
    }
    

    上面的程序会有如下输出:

    Copy
    my age is  0  
    my age is 29  
    my new age is 54
    

    声明变量并初始化

    声明变量的同时可以给定初始值。 var name type = initialvalue 的语法用于声明变量并初始化。

    Copy
    package main
    
    import "fmt"
    
    func main() {
        var age int = 29 // 声明变量并初始化
    
        fmt.Println("my age is", age)
    }
    

    在上面的程序中,age 是具有初始值 29 的 int 类型变量。如果你运行上面的程序,你可以看见下面的输出,证实 age 已经被初始化为 29。

    Copy
    my age is 29
    

    类型推断(Type Inference)

    如果变量有初始值,那么 Go 能够自动推断具有初始值的变量的类型。因此,如果变量有初始值,就可以在变量声明中省略 type

    如果变量声明的语法是 var name = initialvalue,Go 能够根据初始值自动推断变量的类型。

    在下面的例子中,你可以看到在第 6 行,我们省略了变量 ageint 类型,Go 依然推断出了它是 int 类型。

    Copy
    package main
    
    import "fmt"
    
    func main() {
        var age = 29 // 可以推断类型
    
        fmt.Println("my age is", age)
    }
    

    声明多个变量

    Go 能够通过一条语句声明多个变量。

    声明多个变量的语法是 var name1, name2 type = initialvalue1, initialvalue2

    Copy
    package main
    
    import "fmt"
    
    func main() {
        var width, height int = 100, 50 // 声明多个变量
    
        fmt.Println("width is", width, "height is", heigh)
    }
    

    上述程序将在标准输出打印 width is 100 height is 50

    你可能已经想到,如果 width 和 height 省略了初始化,它们的初始值将赋值为 0。

    Copy
    package main
    
    import "fmt"
    
    func main() {  
        var width, height int
        fmt.Println("width is", width, "height is", height)
        width = 100
        height = 50
        fmt.Println("new width is", width, "new height is ", height)
    }
    

    上面的程序将会打印:

    Copy
    width is 0 height is 0  
    new width is 100 new height is  50
    

    在有些情况下,我们可能会想要在一个语句中声明不同类型的变量。其语法如下:

    Copy
    var (  
        name1 = initialvalue1,
        name2 = initialvalue2
    )
    

    使用上述语法,下面的程序声明不同类型的变量。

    Copy
    package main
    
    import "fmt"
    
    func main() {
        var (
            name   = "naveen"
            age    = 29
            height int
        )
        fmt.Println("my name is", name, ", age is", age, "and height is", height)
    }
    

    这里我们声明了 string 类型的 name、int 类型的 age 和 height(我们将会在下一教程中讨论 golang 所支持的变量类型)。运行上面的程序会产生输出 my name is naveen , age is 29 and height is 0

    简短声明

    Go 也支持一种声明变量的简洁形式,称为简短声明(Short Hand Declaration),该声明使用了 := 操作符。

    声明变量的简短语法是 name := initialvalue

    Copy
    package main
    
    import "fmt"
    
    func main() {  
        name, age := "naveen", 29 // 简短声明
    
        fmt.Println("my name is", name, "age is", age)
    }
    

    运行上面的程序,可以看到输出为 my name is naveen age is 29

    简短声明要求 := 操作符左边的所有变量都有初始值。下面程序将会抛出错误 cannot assign 1 values to 2 variables,这是因为 age 没有被赋值

    Copy
    package main
    
    import "fmt"
    
    func main() {  
        name, age := "naveen" //error
    
        fmt.Println("my name is", name, "age is", age)
    }
    

    简短声明的语法要求 := 操作符的左边至少有一个变量是尚未声明的。考虑下面的程序:

    Copy
    package main
    
    import "fmt"
    
    func main() {
        a, b := 20, 30 // 声明变量a和b
        fmt.Println("a is", a, "b is", b)
        b, c := 40, 50 // b已经声明,但c尚未声明
        fmt.Println("b is", b, "c is", c)
        b, c = 80, 90 // 给已经声明的变量b和c赋新值
        fmt.Println("changed b is", b, "c is", c)
    }
    

    在上面程序中的第 8 行,由于 b 已经被声明,而 c 尚未声明,因此运行成功并且输出:

    Copy
    a is 20 b is 30  
    b is 40 c is 50  
    changed b is 80 c is 90
    

    但是如果我们运行下面的程序:

    Copy
    package main
    
    import "fmt"
    
    func main() {  
        a, b := 20, 30 // 声明a和b
        fmt.Println("a is", a, "b is", b)
        a, b := 40, 50 // 错误,没有尚未声明的变量
    }
    

    上面运行后会抛出 no new variables on left side of := 的错误,这是因为 a 和 b 的变量已经声明过了,:= 的左边并没有尚未声明的变量。

    变量也可以在运行时进行赋值。考虑下面的程序:

    Copy
    package main
    
    import (  
        "fmt"
        "math"
    )
    
    func main() {  
        a, b := 145.8, 543.8
        c := math.Min(a, b)
        fmt.Println("minimum value is ", c)
    }
    

    在上面的程序中,c 的值是运行过程中计算得到的,即 a 和 b 的最小值。上述程序会打印:

    Copy
    minimum value is  145.8
    

    由于 Go 是强类型(Strongly Typed)语言,因此不允许某一类型的变量赋值为其他类型的值。下面的程序会抛出错误 cannot use "naveen" (type string) as type int in assignment,这是因为 age 本来声明为 int 类型,而我们却尝试给它赋字符串类型的值。

    Copy
    package main
    
    func main() {  
        age := 29      // age是int类型
        age = "naveen" // 错误,尝试赋值一个字符串给int类型变量
    }


    变量命名规范
    1 变量命名,推荐用驼峰  AgeOfXX==  (变量,函数,大写字母开头表示导出,外部包可以使用)
    2 go文件命名,推荐用下滑线
    3 个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线
    4 不要用关键字和保留关键字作为变量名
    5 大写字母和小写字母是不同的:Name和name是两个不同的变量
    
    6 Go语言中关键字有25个
        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
    
    7 有37个保留字,主要对应内建的常量、类型和函数
        内建常量: true false iota nil
        内建类型:  int int8 int16 int32 int64
                     uint uint8 uint16 uint32 uint64 uintptr
                   float32 float64 complex128 complex64
                   bool byte rune string error
        内建函数: make len cap new append copy close delete
                  complex real imag
                  panic recover
    命名规范

    变量定义方式

    # 记住三种
        -var a int =10
        -var a =10
        -a:=10
    # 掌握定义多个
        -var a,b int=10,11
        -var a,b =10,11
        -a,b:=10,11
    # 了解其它方式
        var (
            name="lqz"
            age int
        )
    # 注意点:
        1 变量要先定义再使用
        2 完整定义可以先定义再赋初值,后面两种方式,定义阶段必须赋初值
        3 变量的类型一旦确定,后期不能修改(跟py最大的差距)
    View Code
     
    每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
  • 相关阅读:
    2014年互联网发展趋势如何
    服务器出现阶段性错误
    用互联网思想武装自己
    杭州互联网公司汇总
    互联网牛人网址大全
    ffmpeg开发指南
    Windows下FFmpeg快速入门
    FFmpeg介绍及参数详细说明
    windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载
    FFMPEG视音频编解码零基础学习方法 【荐】
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/14944695.html
Copyright © 2020-2023  润新知