聊一聊GO中的变量、常量以及枚举

变量

首先我们来说一说变量,在计算机语言中,变量就是用来存储值的一个载体。其中变量名可以使用字母、数字、下划线组成,并且第一个字符不能是数字。注意的是,GO语言中如果只声明,定义而不使用这个变量,那么编译就会报错。
在GO语言中声明变量的一般形式:

var identifier type
var identifier1, identifier2 type

//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 //和python 很像,不需要显示声明类型,自动推断,
										//也不需要加分号,GO语言中自动帮我们加了,
										//我们自己另外加也不会报错
vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不能是已经被声明过的
									 //否则会导致编译错误,这里:=也叫作海象运算符,
									 //意思是将声明和定义都放在了一起。

var (
  vname1 v_type1					// 这种因式分解关键字的写法一般用于声明全局变量
  vname2 v_type2
)

“:=” 赋值操作符,高效创建新变量,初始化声明:a := 50 或 b := false,a 和 b 的类型(int 和 bool)将由编译器自动推断。
这是使用变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。
在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,但可以赋值;
声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误
全局变量可以声明但不用。
_ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值

常量

在程序运行的过程中,会改变的叫做变量,不会改变的叫做常量。数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 常量的定义格式:(可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。)

const identifier [type] = value
const b = "abc"

当需要进行多个相同类型声明时,可以简写为:

const c_name1, c_name2 = value1, value2

此外,常量经常用于枚举中

const (
  Unknown = 0
  Female = 1
  Male = 2
)
0,1,2 代表未知、女、男

在常量中,也有几个很经常使用的函数:

  • 常量可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过。
  • iota,特殊常量,可认为是可以被编译器修改的常量。在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;
package main

import "fmt"
const (
  i=1<<iota
  j=3<<iota
  k
  l
)

func main() {
  fmt.Println("i=",i)		//i=1:左移 0 位,不变仍为 1;
  fmt.Println("j=",j)		//j=3:左移 1 位,变为二进制 110, 即 6;
  fmt.Println("k=",k)		//k=3:左移 2 位,变为二进制 1100, 即 12;
  fmt.Println("l=",l)		//l=3:左移 3 位,变为二进制 11000,即 24。
}
//结果:
//i= 1
//j= 6
//k= 12
//l= 24

枚举

最后,我们来说一说枚举。枚举,顾名思义,将变量的值一一列举出来,但是变量只限于列举出来的值的范围内取值。特别注意的是,Go语言中没有枚举这种数据类型的,但是可以使用const配合iota模式来实现。

接下里说说不同的枚举类型:

普通枚举

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

自增枚举

//iota只能用于常量表达式, 它默认开始值是0,const中每增加一行加1,同行值相同
const (
	a = iota //0
	c        //1
	d        //2
)

const (
	e, f = iota, iota //e=0, f=0
	g    = iota       //g=1
)
//其中,若中间中断iota,必须显式恢复。
const (
  a = iota    //0
  b           //1
  c = 100     //100
  d           //100
  e = iota    //4
)
上一篇:阿里:有益的d技术


下一篇:GO语言安装、变量