菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
211
0

Golang | 变量和常量

原创
05/13 14:22
阅读数 35767

变量

变量的定义

变量是几乎所有的编程语言中最基本的组成元素。从根本上来说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。
在Go语言中,变量和其它的C语言系的语言都是不同的,看下面的声明就知道了。

变量的声明

Go语言 的变量的声明和 js 和像,也是使用var来进行标识的。


但是Go语言是静态类型语言,因些,变量是具有明确类型的,编译器也会检查变量类型是否正确。
格式为:

    var 变量名 类型

Go语言和许多C类型的语方是不同的,它的声明变量时将变量的类型放在变量名的后面,因为Go语言的设计者认为我们在写代码的时候,主要关注的是变量的命名,所以把变量名放在前面,这样做的好外有就是在一次性声明多个变量的时候,可以很清楚的表现出来。

在Go语言中变量名由数字字母下划线组成,其中数字不能为首字母

例:

    var v1 string

这就量个Go语言的变量的定义,注意:在Go语言中每一句后面是不用加上分号(;)的 ,和其它的强类型语言相比,Go语言摒弃了语句必须以分号作为语句结束标记的习惯。


var 关键字的另一程用法就是可以将若干个需要声明的变量放置在一起,避免在书写的时候需要重复写var关键字:
例:

    var (
        v1 int
        v2 string
    )

变量的初始化

在Go语言中变量的初始化有三种方式,在定义的时候,变量需要进行初始化的场景,var关键字可以保留,也可以不用,但不再是必要的元素:
例:

    var v1 string = "abc"
    var v2 = "abc"
    v3 := "abc"

上面三种方式定义出来的义变是完全相同的,但是写法不一样,除了第三种方式不能声明全局变量以外,另外两种都可以,但是在方法中的时候,第三种与第一种相比,需要输入的字符数大大减少,是聪明程序员的最佳选择


第二种方法和第三种方法都没有规定变量的类型,这里说明,Go语言中变量的类型不再是必需的,Go编译器可以从初始化表达式的右值推导出该变量应该声明为那种类型。


并且Go语言的变量在初始化的时候,可以同时初始化多个不同类型的变量:

     v1 , v2 := 1 , "str"   //第一个类型是int类型的,第二个类型是string类型的。
     fmt.Println(v1 , v2)

注意:
在 := 左侧的变量不应该是已被声明过的,否则会导致编译错误。
例:

    v1 := "老酒馆的猫"
    //v1 := "老酒馆"  //错误的例子
    //但是有一种方法可以让已经是声明过的变量再声明的不会报错。
    v1 , v2 := "老酒馆" , "的猫" 
    fmt.Println(v1 , v2)

变量的赋值

在Go语法中,变量初始化变量赋值是两个概念,初始化是定义一个变量的时候,就把一个变量给定了值,但是赋值是在声明以后才进行的:
例:

    // 变量赋值
    var str string
    str = "老酒馆的猫"

单个变量的赋值和其它语言中的赋值是一样的,但日Go语言中有其它语言不具备的,就量两个变量可以相互的交换值:

    // 变量初始化
    a := 10 
    b := 20 
    a , b = b , a 
    fmt.Println(a,b)    //20 , 10

在别的语言中,必须有一个中间数来进行值的交换,比如:

    int a = 10;
    int b = 20;
    int c;
    c = a;
    a = b;
    b = c;

这个时候就定义了一个无用的变量,并且语法上面还没有Go语言来的简洁,直观,性能上也不如。

匿名变量

在Go语言中,我们如果在定义函数的时候,我们有不想要的变量,我们就可以把这个变量抛弃掉,不用这个变量,基本上屏蔽掉了可能混淆阅视听的内容,从而大幅度提并了沟通的效率,和代码维护的难度。
例:

    func getTime() (hour , minute , second int){
        return 12 , 23 , 55
    }

这个时候,我们只想获取小时,我们可以这样:

    hour , _ , _  = getTime()

就如上面这样就可以了,这样就可以把另外两个变量给抛弃了,这就叫匿名变量

变量的存储和生命周期

Go语言提供自动内存管理,通常我们不需要特别关注变量的生存期和存放的位置,编译器会使用栈逃逸技术能够自动为变量分配内存空间:可能在上,也可能在上。

变量的作用域

变量的作用域指的是一个变量生效的范围,跟据这个定义,我们可以把变量分为全局变量局部变量
例:

    // 全局变旺
    var gg string = "abc"
    func main() {
        var s int = 1
        fmt.Println(gg)      // abc
        var gg int = 100
        fmt.Println(gg)     // 100
        {
            var s string = "str"
            fmt.Println(s)   // str
        }
        fmt.Println(s)       //1
    }

上面这个例子就是说明不用的局部变量作用域内的变量之间互相之间是没有影响的,但是全局变量和局部变量之间会符合一种就近原则,就是如果在使用之前对全局变量进行全新的定义,那么就会使用全新的定义。

常量

定义

常量是一个简单值的标识符,在程序运行时,不会被修改的量。常量使用一个名称来绑定一块内存地址,该内存地址中存放的数据类型由定义常量时指定的类型来决定,并且该内存地址里面存放的值是不可以被改变的,


Go语言中的常量分为:布尔型字符串类型数值型
常量一般存储在程序的只读段里。

字面常量

字面常量通常指的是程序中硬编码的常量:

如:
66 数值常量
3.1415926 浮点型常量
1.8 + 66i 复数类型的常量
true 布尔类型常量
"cat" 字符串常量

字面常量在Go语言程序中是无类型的,只要这个常量在相应类型的值域范围内,就可以做为该类型的常量。比如:66 就可以赋值给 :intuintint32int64float32float64complex64complex128等。

常量的定义

Go语言的常量的定义可以限定常量类型,但是也可以不用,它和变量一样,如果定义的时候,没有指定类型,那么程序运行中,会概把字面常量把常量的类型给推导出来。

显式类型定义

显示定义常量,就是把常量的类型写出来。

    const PATH string = "http://www.baidu.com"  //定义一个百度网址常量字符串
    const PI float64 = "3.1415926"  //定义一个圆周率的常量

隐式类型定义

隐式写义常量就是定义的时候不写类型。

    const NAME = "张三"   //不写变量的类型
    const SIZE = 1024      

Go语言的常量可以定义的时候,右值也可以是一个编译期的运算的常量表式。如:

    const num = 2 << 2

这是因为常量的赋值是在编译期进行的,所以可以出现也是编译期运行的常量的表达式,但是如果是编译期值还在变动的是不行的。

批量定义常量

如果我们在定义十多个常量的时候还每一个常量都写一个const的话,那效率真的是太慢了。所以我们有下面的办法批量定义常量。

const(
    a = 1
    b = 2
    c = 3
)

根据上面的方法,我们可以批量的定义一组常量,并且还好管理,我们可以把同一类型的常量定义到一个const里面,这样可以使得代码更加的清晰。

预定义常量

Go语言里面预定义了一些常量,如:truefalseiota
其中iota比较特殊,它可以被认为是一个可以被预编译的常量,在每一个const关键字出现的时候被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字都会自动增加1。

//我们一般结合着const()来使用iota
//如些上面的代码就可以改为
const(
    a = iota    //0
    b = iota    //1
    c = iota    //2
)

这和上面的代码的效果是一样的。
也可以这样写:

const(
    a = iota    //0
    b            //1
    c            //2
)

这样可以更加的简单一点,并且这样是因为,Go语言里面如果一组常量里面,如果某个常量 没有初始值,那么默认和上一行一致。


我们还可以在这里面运用表达式。

const(
    a = 1 << iota   //0
    b                   //2
    c                   //4
)

枚举

Go语言没有专门来定义枚举类型的关键字,所以我们用枚举类型的时候,都是用常量来定义的。例:

const(
    MONDAY = 1 + iota
    TUESDAY
    WEDNESDAY
    THURSDAY
    FRIDAY
    SATURDAY
    SUNDAY
)

上面是一个星期的枚举类型的定义。



细节决定成败!
个人愚见,如有不对,恳请扶正!

发表评论

0/200
211 点赞
0 评论
收藏