文章目录

  • 变量
  • 变量的声明
  • 变量的初始化
  • 多个变量同时赋值
  • 匿名变量
  • 作用域


变量

变量的声明

Go语言是静态类型语言,变量拥有明确的类型,编译器也会检查变量类型的正确性。

在Go语言中,声明变量时将变量的类型放在变量的名称之后,避免含糊不清的声明形式。

通过下面代码了解变量声明的基本样式

var a int
	var b string
	var c []float32
	var d func() bool
	var e struct {
		x int
	}

代码说明:

  • 第一行,声明一个整形类型的变量,可以保存整数数值。
  • 第二行,声明一个字符类型的变量。
  • 第三行,声明一个32位浮点切片类型的变量,浮点切片表示由多个浮点类型组成的数据结构。
  • 第四行,声明一个返回值为布尔类型的函数变量,这种形式一般用于回调函数,即将函数以变量的形式保存下来,在需要的时候重新调用这个函数。
  • 第五行,声明一个结构体类型的变量,这个结构体拥有一个整形的x字段。

当一个变量被声明之后,系统会自动赋予它该类型的零值:nt 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil 等。所有内存在Go中都是经过初始化的

比如上面的程序输出为

//0和【】中间有一个空白字符串
0  [] <nil> {0}

变量的声明主要有以下几种

标准格式

格式为:

var 变量名 变量类型

声明变量以关键字var开头,后置变量类型,末尾不需要分号。

批量格式

var (
		a int
		b string
		c []float32
		d func() bool
		e struct {
			x int
		}
	)

使用关键字var和括号,可以将一组变量定义放在一起。

简短格式

//简短格式
	i := 0
	fmt.Println(i)

简短格式有以下限制:

  • 定义变量,同时显示初始化
  • 不能提供数据类型
  • 只能用于函数内部

简短格式拥有简洁和灵活的特点,被广泛用于大部分的局部变量的声明和初始化,往往用于显式指定变量类型的地方,或者因为变量稍后会被重新赋值而初始化无关紧要的地方。

变量的初始化

Go语言在声明变量时会自动对变量对应的内存区域进行初始化操作,会赋予对应的初始化值。也可以在变量声明时赋予变量一个初始值。

标准格式

var 变量名 类型 = 表达式

例如:

//标准格式的初始化
	var hp int = 100
	fmt.Println(hp)

编译器推导类型的格式

在标准格式的基础上,将int省略后,编译器会尝试根据等号右边的表达式推导变量类型

//推到格式
	var dp = 60
	fmt.Println(dp)

等号右边的部分在编译原理被称为右值(rvalue)

短变量声明并初始化

//短变量声明并初始化

	bp := 80
	fmt.Println(bp)

这也是推导声明写法,编译器回自动根据右值类型推断出左值的对应类型。

如果左值已经被声明过了,但依然使用:=时编译器会报错。

例如:

go语言语法描述 go语言基础语法_局部变量


在多个短变量的声明和赋值中,只要至少有一个新变量出现在左值中,编译器就不会报错。

多个变量同时赋值

var a int = 10
	var b int = 20

	b, a = a, b

	fmt.Println(a, b)

变量的左值和右值按从左到右的顺序赋值

匿名变量

如果不需要在左值中接收变量,可以使用匿名变量
匿名变量的特点是一个下画线_,“_”本身就是一个特殊的标识符,被称为空白标识符。使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。

匿名变量不占用命名空间,不会分配内存。匿名变量和匿名变量之间也不会因为多次声明而无法使用。

作用域

根据变量定义位置的不同,可以分为以下三个类型:

  • 函数内定义的变量称为局部变量
  • 函数外定义的变量称为全局变量
  • 函数定义中的变量称为形式参数

局部变量

在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。

局部变量不是一直存在的,它只在定义它的函数被调用后存在,函数调用结束后这个局部变量就会被销

package main

import (
	"fmt"
)

func main() {
	//声明局部变量 a 和 b 并赋值
	var a int = 3
	var b int = 4
	//声明局部变量 c 并计算 a 和 b 的和
	c := a + b
	fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}

结果:

a = 3, b = 4, c = 7

全局变量

在函数体外声明的变量称之为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,当然,不包含这个全局变量的源文件需要使用“import”关键字引入全局变量所在的源文件之后才能使用这个全局变量。

全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。

package main

import "fmt"

//声明全局变量
var c int

func main() {
	//声明局部变量
	var a, b int

	//初始化参数
	a = 3
	b = 4
	c = a + b

	fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}

结果:

a = 3, b = 4, c = 7

Go语言程序中全局变量与局部变量名称可以相同,但是函数体内的局部变量会被优先考虑

例如:

package main

import "fmt"

//声明全局变量
var c int = 10

func main() {
	//声明局部变量
	var a, b int

	//初始化参数
	a = 3
	b = 4
	c = a + b

	fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}

结果:

a = 3, b = 4, c = 7

形式参数

在定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。

形式参数会作为函数的局部变量来使用。