Go语言入门系列四《Golang变量和常量》

一、变量的概念

变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.

二、变量的声明

go语言中的变量声明有三种形式,下面由繁到简进行介绍。

第一种,声明并指定类型

var name string = "cason"    

第二种,声明但不显示指定类型(编译器将自动推断类型)

var name = "cason"

第三种省略 var

name := "cason"

推荐使用该方式进行变量的声明,需要注意的是,左侧的变量不可以是已经声明过的、否则将无法编译通过。另外补充一点,也可以只声明变量而不进行初始化,这种情况下将会使用默认值。

var name string
var age int
var is_man  bool

go入门-东野文然

三、多变量的声明

Golang 有着灵活的变量声明形式,这有点像 Javascript ,例如我们可以采用下面形式进行变量声明

第一种:多变量指定类型(相同类型)

var your_name , her_name , my_name string;

当然你可以同时进行初始化

var your_name, her_name, my_name string = "jack", "rose", "cason"

第二种:多变量不指定类型(相同类型)

var your_name, her_name, my_name = "jack", "rose", "cason"

不进行初始化的情况下必须指定类型

var your_name , her_name , my_name string; //string 不可省略

否则将无法编译通过

./variable.go:15:35: syntax error: unexpected newline, expecting type
./variable.go:16:2: syntax error: unexpected fmt at end of statement

第三种:省略var自主类型推断

your_name, her_name, my_name := "jack", "rose", "cason"

同样的 := 左边的变量不可是已经声明过的变量

补充 第二种和第三种后面的类型可以不同

第二种不同变量类型

var your_name, your_age, is_boy = "jack", 18, true

第三种不同变量类型

your_name, your_age, is_boy := "jack", 18, true

四、变量的作用域

首先了解一下 作用域,所谓作用域就是指,已经声明的常量,变量函数或者包在代码中的作用范围。

变量作用域的不同取决于其声明的位置不同,换句话说,按照声明位置的不同我们可以将变量的作用域大致分为三种,分别为: 全局变量、局部变量及形式参数。

全局变量

定义在函数外部的变量,我们称之为全局变量。如下面代码

package main

//全局变量
var num int = 0

func main() {
    //code
    //可以访问到全局变量 num
}

局部变量

定义在函数内部的变量,我们称之为局部变量。如下面代码

package main

func main() {
    //局部变量
    var num int = 0
    //可以访问到局部变量 num
}

func function_name(){
    //访问不到局部变量 num
}

形式参数

函数定义中的变量称为形式参数,例如

func sum(num1,num2 int){
    return num1 + num2
}

代码中 func sum(num1,num2 int){}, num1,num2 就是形式参数。在使用过程中形式蚕食通常作为函数的局部变量来使用,如上面的代码 return num1 + num2。既然有形式参数,那就有实际参数。在调用函数的时候传递进去的参数就是实际参数。如下面代码

func main() {
    fmt.Println(sum(1, 2))// 1 和 2 即为实际参数
}

作用域补充

Go语言中允许局部变量和全局变量重名,在使用时优先使用在访问范围之内的局部变量。如下面代码所体现的

var num_one int = 20 //全局变量

func main() {
    var num_one int = 10  //局部变量,与上面的全局变量重名
    fmt.Println("main函数中的num_one:", num_one) //使用的是局部变量
    fmt.Println("test_num:", test_num(1)) //使用的是局部变量
}

func test_num(num int) int {
    return num + num_one //num_one 使用的是全局变量 num + 20
}

输出的结果为

main函数中的num_one: 10
test_num: 21

五、常量

“常量”的广义概念是:‘不变化的量’,如真空中传播的光速,声音在空气中传播的速度。

在计算机编程中常量相对于变量而存在,例如我们我们定义了一个圆周率常量Pi,在编程过程中我们不会再去改变这个值。也就是说一旦确定不需要再进行更改的值,我们就可以将其作为一个常量。

Golang 中常量的定义

const identifier [type] = value
//eg:
const speed_of_sound int = 340

与变量相同,我们也可以省略类型

const speed_of_sound = 340

可以多常量定义

const int_val, string_val, bool_val = 100, "hi", true

Golang 中的特殊常量 iota

这是Golang 的特点之一,iota 在每个 const 出现时都将被重置为 0 ,直到下一个 const 出现前,iota 每出现一次都将在原来的基础上 +1。该特性非常适合用于枚举类型

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

上面的写法还可以写成下面这样

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

典型的例子

const (
    a = iota //0
    b //1
    c //2
    d = 8 //iota +=1
    e = "cason" //iota +=1
    f = iota //iota +=1
    g
)
fmt.Println(a, b, c, d, e, f, g)

打印结果为

0 1 2 8 cason 5 6

iota 出现后每个新行都会 自增1,如果出现的不是iota,那么下一行的值将与上一行保持一致

const (
    a = 0 //0
    b     //1
    c     //2
    d = 8
    e
    f = "hello"
    g
)
fmt.Println(a, b, c, d, e, f, g)

打印结果为

0 0 0 8 8 hello hello

未经允许不得转载