Go基础 - 变量和常量

140 阅读5分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

在任何一门现代的高级语言中,变量和常量都是它非常基础的程序结构的组成部分,和直观上的字面表述一样,变量常量分别表示在程序中可以用来承载可变数据的对象和不可变数据的对象。

在这之前先了解一下golang的标识符和关键字:

标识符

在Go中标识符就是开发者定义的被赋予特殊意义的词,比如变量名、常量名、函数名等等。 Go语言和大部分的高级语言一样,标识符由字母数字和**下划线( _ )**组成,并且只能以字母和下划线开头。

比如说,下面就是几个简单的标识符:name_age_1011a1024

当然,标识符也可以是中文:丰丞秀儿,游戏

关键字

程序是用来让机器跑起来的逻辑,而用来表达这个逻辑的载体就是我们写的一行行的代码。就像我们说话一样,每一个中文的字其实都是在我们中文这个语言体系中间定义好的一个个有含义的东西。

在我们这个语言体系下,大家按照对他的理解进行翻译这样我们就能沟通了。

Go语言远没有中文这么复杂,它只有25个关键字:

    var          default      func         interface    select
    case         defer        go           map          struct
    chan         else         goto         package      switch
    const        fallthrough  if           range        type
    continue     for          import       return       break

此外,Go语言中还有如下的保留字。

    Constants:    true  false  iota  nil

    Types:        int  int8  int16  int32  int64
                  uint  uint8  uint16  uint32  uint64  uintptr
                  float32  float64  complex128  complex64
                  bool  byte  rune  string  error

    Functions:   make  len  cap  new  append  copy  close  delete
                 complex  real  imag
                 panic  recover

变量

从底层往上看,计算机中间存储的数据都是落在内存中间的某个存储单元上面。当我们对这个数据进行操作的时候,其实是会对该地址上存储的数据进行操作。

但是这种直接用地址去内存中间寻找到数据再进行操作是非常不直观的,而且逻辑上也不容易被理解。所以我们会给这些数据用一个便于我们识别的“代号”来表示他们。之后的所有操作都是对这个我们能读懂的对象和计算机进行交流了。

变量类型

在漫长的计算机结构发展过程中,应对各种需要处理的数据。衍生出一套系统的类型:比如表示数字的整形、表示小数的浮点形、表示字符串的string类型等。

在Go中,变量有各种类型,而且变量需要先声明类型之后才能使用。

变量的声明

可以用关键字 var 后面搭配变量类型声明变量:

var num int

var(
     name     string      // 默认为 ""
     age      int         // 默认为 0
     height   float64     // 默认位 0.0
     right    bool        // 默认为 false
)

在变量被声明出来之后,默认会对其指定的内存赋予初始的类型值。几个特殊类型的类型声明:

切片(slice),指针(point)函数(func) 默认值为nil(表示为空的意思)。

    var slices []int64    // 默认为 nil
    var say    func()
    var pointer * int

我们可以在变量被声明出来的时候,对其进行初始化:

    num:=10
    name:="丰臣秀儿"
    age:=520
    height:=175.3
    right:=true

Go语言是一种强类型的语言,也就是说定义变量的时候需要明确的让编译器知道这个变量是什么类型的,而上面这种定义方式是由编译器根据后面的值类型自动推导的。

匿名变量(anonymous variable)

在很多时候,我们基于某一些编程范式下面,函数的参数或者其他方法的返回值中有某些是我们暂时不会用到的对象,这个时候我们可以用_来做忽略。

比如:

package main

func Add(a int, b int, _ int) (result int, ok bool) {
	return a + b, true
}

func main() {

	var a = 10
	var b = 20
	var c = 20

	result, _ := Add(a, b, c)
	println(result)
}

中间的函数参数和返回值在我们暂时未使用到的时候,如果用其他变量承载但是未被使用到的时候,会lint失败。但是使用匿名变量可以很好的进行处理。

常量

常量就是用来存放一些在程序设计中间恒定不变的数据。比如我们熟知的数学中的 PI = 3.14159,数学常量:e=2.718 ,这些就非常适合定义为常量。

因为定义之后在程序运行过程中是恒定不变的,所以常量要求在定义的时候给定初始值。

定义

我们可以用 const 关键字定义常量:

const PI = 3.14159
const E = 2.718
const SIX = "six"
const (
    A1    = "hundred"
    B1
    C1
)

当定义多个数据一致的常量的时候,我们可以采用合批的方式简化定义。

itoa计数器

在常量数值的定义中,我们可以使用itoa关键字进行自动递增。

const (
	a = iota // a = 0
	b        // b = 1
	c        // c = 2
	_
	d = 100  // d = 100
	e = iota // e = 5
	f        // f =6
)

当我们使用itoa定义常量的时候,itoa是当前常量块内的定义计数,后面的常量会依次增加。当我们使用_占位置的时候,当前的计数会继续增长。同一个常量快中定义的多个iota的时候,计数器会重新获得当前的占位符的位置。