1.1 什么是变量

在计算机中所有的指令都存在内存中,每块内存都会有一个地址,数据就存在

这些内存中,在计算机语言中,为了操作内存的方便性,可以给某块内存取一

个名字,通过名字去读取内存的值或者写某个值到内存中去,这个名字就是变

量,即 var iable,在go语言中用var表示这样的内存是一个变量。所以我们可以

认为变量就是一小块内存,用于存储数据,通过变量去改变和访问内存中的

值。

1.2 定义变量

Go语言里面定义变量有多种方式。

使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型放

在变量名后面:

定义多个变量

//定义三个类型都是“type”的变量

var num1, num2, num3 type

定义变量并初始化值

//初始化“variableName”的变量为“value”值,类型是“type”

var variableName type = value

同时初始化多个变量

/* 定义三个类型都是”type”的变量,并且分别初始化为相应的值 num1为v1,num2为

v2,num3为v3*/

var num1, num2, num3 type= v1, v2, v3

你是不是觉得上面这样的定义有点繁琐?没关系,因为Go语言的设计者也发现

了,有一种写法可以让它变得简单一点。我们可以直接忽略类型声明,那么上

面的代码变成这样了:

/* 定义三个变量,它们分别初始化为相应的值 num1为v1,num2为v2,num3为v3 然后

Go会根据其相应值的类型来帮你初始化它们*/

var num1, num2, num3 = v1, v2, v3

你觉得上面的还是有些繁琐?好吧,我也觉得。让我们继续简化:

/* 定义三个变量,它们分别初始化为相应的值 num1为v1,num2为v2,num3为v3 编译

器会根据初始化的值自动推导出相应的类型*/

num1, num2, num3 := v1, v2, v3

现在是不是看上去非常简洁了?:=这个符号直接取代了var和type,这种形式叫做

简短声明。不过它有一个限制,那就是它只能用在函数内部;在函数外部使用

则会无法编译通过,所以一般用var方式来定义 全局变量 。

_(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃。在这个例子中,

我们将值35赋予b,并同时丢弃34:

_, b := 34, 35

Go对于已声明但未使用的变量会在编译阶段报错,比如下面的代码就会产生一

个错误:声明了age但未使用。

/*

更多课程信息:

goland deveops 项目实战:

Linux C/C++服务器/架构师课程:

更多学习资料: C/C++架构师:762073882 ,Golang Deveops项目实战:148745800

*/

package main

import “fmt”

func main() {

num1, num2, num3 := 1, 2, 3

var age = 30

fmt.Printf(“vaname1 is %d, num2 is %d, num3 is %d\n”, num1, num2, num3)

}

所谓常量,也就是在程序编译阶段就确定下来的值,而程序在运行时无法改变

该值。在Go程序中,常量可定义为数值、 布尔值 或字符串等类型。

它的语法如下:

const constantName type = value

//如果需要,也可以明确指定常量的类型:

const PI float32 = 3.1415926

下面是一些常量声明的例子:

const PI = 3.1415926

const i = 10000

const MaxThread = 10

const url = “www.0voice.com”

Go 常量和一般程序语言不同的是,可以指定相当多的小数位数(例如200位),

若指定给float32自动缩短为32bit,指定给float64自动缩短为64bit,详情参考链

bool ean

在Go中,布尔值的类型为bool,值是true或false,默认为false。

//示例代码

var isActive bool // 全局变量声明

var enabled, disabled = true, false // 忽略类型的声明

func test() {

var available bool // 一般声明

valid := false // 简短声明

available = true // 赋值操作

}

在C和C++中,bool类型的值用“0”值表示false,非“0”值表示true,那么

在Golang语言中,bool类型的变量只有true和false两个值,没有其它的值,比

如以下代码就是错误的

/*

更多课程信息:

goland deveops 项目实战:

Linux C/C++服务器/架构师课程:

更多学习资料: C/C++架构师:762073882 Golang Deveops项目实战:148745800

*/

package main

import “fmt”

func main() {

x := 100

var b bool = x

if x {

fmt.Printf(“零声学院一切只为渴望更优秀的你”)

}

}

编译的时候就出现了以下错误

src\hello\hello.go:14:6: cannot use x (type int) as type bool in assignment

src\hello\hello.go:16:2: non-bool x (type int) used as if condition

数值类型

数值类型:

uint8 the set of all unsigned 8-bit integers (0 to 255)

uint16 the set of all unsigned 16-bit integers (0 to 65535)

uint32 the set of all unsigned 32-bit integers (0 to 4294967295)

uint64 the set of all unsigned 64-bit integers (0 to

18446744073709551615)

int8 the set of all signed 8-bit integers (-128 to 127)

int16 the set of all signed 16-bit integers (-32768 to 32767)

int32 the set of all signed 32-bit integers (-2147483648 to 2147483647)

int64 the set of all signed 64-bit integers (-9223372036854775808 to

9223372036854775807)

float32 the set of all IEEE-754 32-bit floating-point numbers

float64 the set of all IEEE-754 64-bit floating-point numbers

complex64 the set of all complex numbers with float32 real and

imaginary parts

complex128 the set of all complex numbers with float64 real and

imaginary parts

byte alias for uint8

rune alias for int32

uint either 32 or 64 bits

int same size as uint

uintptr an unsigned integer large enough to store the uninterpreted bits

of a pointer value

【注意一】不同类型间不允许操作

需要注意的是,这些类型的变量之间不允许互相赋值或者操作,不然再编译时

会引起编译错误:

例如下面这段代码会出现:invalid operation: a + b (mismatched types int8

and int32)

/*

更多课程信息:

goland deveops 项目实战:

Linux C/C++服务器/架构师课程:

更多学习资料: C/C++架构师:783153655 Golang Deveops项目实战:148745800

*/

package main

import “fmt”

func main() {

var a int8 = 20

var b uint32 = 35

c := a + b

fmt.Printf(“欢迎来到零声学院”)

}

当然我们可以采用显示转换的方式去强制转换,比如下面这种方式:

package main

import (

“fmt”

“reflect”

)

func main() {

var a byte = 20

var b uint32 = 35

c := uint32(a) + b

fmt.Println(c)

fmt.Println(reflect.TypeOf(a))

fmt.Println(reflect.TypeOf(c))

}

数值类型中看到有两个别名,byte和rune,这两个别名分别是unit8和int32的

别名,上文中我们提到了变量a 和 b之间不能相加赋值为c,但是如果是别名和

对应的类型之间是可以转换的。

/*

更多课程信息:

goland deveops 项目实战:

C/C++服务器/架构师课程:

更多学习资料: C/C++架构师:762073882 Golang Deveops项目实战:148745800

*/

package main

import (

“fmt”

“reflect”

)func main() {

var a int32 = 20

var b rune = 35

c := a + b

fmt.Println(c)

fmt.Println(reflect.TypeOf(c))

}

【注意二】我们看到数值部分有个叫做uintptr类型,这个uintptr就是保存了一

个指针的地址值的类型,它默认就是64位的,类似于C语言的 void *,即保存指

针用的

浮点数的类型有float32和float64两种(没有float类型),默认是float64。

这就是全部吗?No!Go还支持 复数 。它的默认类型是complex128(64位实数

+64位虚数)。如果需要小一些的,也有complex64(32位实数+32位虚数)。复数

的形式为RE + IMi,其中RE是实数部分,IM是虚数部分,而最后的i是虚数单

位。下面是一个使用复数的例子:

var c complex64 = 32+5i

//output: (5+5i)

fmt.Println(c)

【注意三】当然golang里不止数值类型和boolean,除了这个实际上还有

array、slice、struct、string interface chan map 等等,这些会在后面的课程

涉及到,详情见: #Types

如果大家在学习过程中有什么疑问,可以进群讨论( 148745800

视频教程