go 变量声明及规则


分类: Golang
评论: 0

go 变量声明及规则



分类: Golang
评论: 0

变量声明和命名规则

对于纯粹的变量声明,Go 语言引入了关键字 var,并且将类型信息放在变量名之后,此外,变量声明语句不需要使用分号作为结束符(实际上,所有的 Go 语句都不需要分号作为结束符,这一点和 JavaScript/Python 很像),比如我们要声明一个类型为 int 的变量 v1,示例如下:

var v1 int

var 关键字的另一种用法是可以将若干个需要声明的变量放置在一起,免得程序员需要重复写 var 关键字,如下所示:

var (
    v1 int 
    v2 string
)

此外,Go 语言支持多种数据类型,关于数据类型,学院君将在后续教程中详细介绍,这里先了解下即可:

var v1 int            // 整型
var v2 string         // 字符串
var v3 bool           // 布尔型
var v4 [10]int        // 数组,数组元素类型为整型
var v5 struct {       // 结构体,成员变量 f 的类型为64位浮点型
    f float64
}
var v6 *int           // 指针,指向整型
var v7 map[string]int   // map(字典),key为字符串类型,value为整型
var v8 func(a int) int  // 函数,参数类型为整型,返回值类型为整型

需要注意的是,变量在声明之后,系统会自动将变量值初始化为对应类型的零值,比如上述 v1 的值为 0v2 的值空字符串,v3 的值为 false,依次类推。

例如:

image

如果变量名包含多个单词,Go 语言变量命名规则遵循驼峰命名法,即首个单词小写,每个新单词的首字母大写,如 userName,但如果你的全局变量希望能够被外部包所使用,则需要将首个单词的首字母也大写。

变量初始化

如果声明变量时想要同时对变量值进行初始化,可以通过以下这些方式:

var v1 int = 10 // 方式一,常规的初始化操作
var v2 = 10		// 方式二,此时变量类型会被编译器自动推导出来
v3 := 10		// 方式三,可以省略 var,编译器可以自动推导出v3的类型

另外,出现在 := 运算符左侧的变量应该是未声明过的,否则会导致编译错误,比如下面这个写法

var i int
i := 1

会导致如下这种编译错误:

no new variables on left side of :=

变量赋值与多重赋值

变量赋值

var v4 int
v4 = 10

多重赋值

var i, j int
i, j = j, i

匿名变量

匿名变量则通过下划线 _ 来声明,任何赋予它的值都会被丢弃。

func GetName() {userName, nickName String} {
    return "huasio", "huasio"
}

上面函数返回两个值,但是只想要第一个值,那么可以通过 _ 将其他值丢弃。

userName, _ := GetName()

变量的作用域

每个变量在程序中都有一定的作用范围,称之为作用域

尽管变量的标识符必须是唯一的,但你可以在某个代码块的内层代码块中使用相同名称的变量,此时外部的同名变量将会暂时隐藏(结束内部代码块的执行后隐藏的外部同名变量又会出现,而内部同名变量则被释放),你任何的操作都只会影响内部代码块的局部变量。

常量使用

在 Go 语言中,常量是指编译期间就已知且不可改变的值,常量只可以是数值类型(包括整型、 浮点型和复数类型)、布尔类型、字符串类型等标量类型。和 PHP/C 一样,在 Go 语言中,我们可以通过 const 关键字来定义常量(遵循 C 语言的约定)。

常量定义

通过 const 关键字定义常量时,可以指定常量类型,也可以省略(底层会自动推导),常见的常量定义方式如下:

const PI float64 = 3.14159265358979323846
const zero = 0.0 // 无类型浮点常量 
const ( // 通过一个 const 关键字定义多个常量,和 var 类似
    size int64 = 1024
    eof = -1  // 无类型整型常量 
)
const u, v, float32 = 0, 3  // u = 0.0, v = 3.0,常量的多重赋值
const a, b, c = 3, 4, "foo" // a = 3, b = 4, c = "foo", 无类型整型和字符串常量

由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式,比如试图以如下方式定义常量就会导致编译错误:

func GetNumber() int {
    return 100
}
const num = GetNumber()

原因很简单,GetNumber() 只有在运行期才能知道返回结果,在编译期并不能确定,所以无法作为常量定义的右值。

此外常量之所以叫常量意思是它的值是恒定不变的,如果你试图在运行时修改常量的值,则会在编译期报错。

预定义常量

Go 语言预定义了这些常量:truefalseiota

前面两个熟悉其他语言的应该都很熟悉,是布尔类型的真假值。

iota 比较特殊,可以被认为是一个可被编译器修改的常量,在每一个 const 关键字出现时被重置为 0,然后在下一个 const 出现之前,每出现一次 iota,其所代表的数字会自动增 1。

const (
	v1 = iota
	v2 = iota
	v3 = iota
)
const (
	vv1 = iota * 2
	vv2
	vv3
)

const x = iota
const y = iota

/**
输出出结果
v1, v2, v3:  0 1 2
vv1, vv2, vv3:  0 2 4
x, y:  0 0
*/

遇到 const 关键词 iota 就会重置为 0,若是没有遇到,那么会一直递增,递增的多少取决于是否参与运算。

枚举

此外,常量还可以用于枚举。

枚举中包含了一系列相关的常量,比如下面关于一个星期中每天的定义。

Go 语言并不支持其他语言用于表示枚举的 enum 关键字,而是通过在 const 后跟一对圆括号定义一组常量的方式来实现枚举。

下面是一个常规的 Go 语言枚举表示法,其中定义了一系列整型常量:

const (
    Sunday = iota 
    Monday 
    Tuesday 
    Wednesday 
    Thursday 
    Friday 
    Saturday 
    numberOfDays
)

常量的作用域

和函数体外声明的变量一样,以大写字母开头的常量在包外可见(类似于 public 修饰的类属性),比如上面介绍的 PiSunday 等,而以小写字母开头的常量只能在包内访问(类似于通过 protected 修饰的类属性),比如 zeronumberOfDays 等,后面在介绍包的可见性时还会详细介绍。