清水泥沙

golang基础(5.变量声明,初始化,赋值,作用域)

变量相当于计算机中一块存储区域的命名,通过定义变量能像系统申请到一块存储空间。通过使用变量名,能对这块存储空间进行操作。

定义变量

在go中,可以使用var关键字来定义变量,且要将值类型放置到变量定义后面。

var i int

可以同时定义多个同类型变量

var i1,i2 int

可以分组定义

var (
	a,a1 int
	b string
  c bool
)
需要注意的是定义变量后,系统会将变量初始化为该类型的初始值,入`i`会为`0`,`b`是`空字符串`,`c`是`flase`
package main

import "fmt"

// 定义一个
var i int

// 定义多个同类型
var i1, i2 int

// 分组定义
var (
	a, a1 int
	b     string
)

func main() {
	fmt.Printf("i is %d 
", i)
	fmt.Printf("i1 is %d 
", i1)
	fmt.Printf("i2 is %d 
", i2)
	fmt.Printf("a is %d 
", a)
	fmt.Printf("a1 is %d 
", a1)
	fmt.Printf("b is %s 
", b)
}

变量初始化

如果需要在定义变量同时对变量进行初始化,可以选择一下三种方式

  • 常规赋值
var c int = 10
  • 自动推导类型,如果定义时不指定类型,在编译期间,编译器会自动推导
var c1 = 10
  • 可以忽略var 关键字使用:,在编译期间,编译器也会自动推导。需要注意使用:初始化的变量名称必须是不存在的,否则会编译报错
c2 := 10
package main

import "fmt"

func main() {
	var c int = 10
	var c1 = 10
	c2 := 10

	fmt.Printf("c is %d 
", c)
	fmt.Printf("c1 is %d 
", c1)
	fmt.Printf("c2 is %d 
", c2)
}

变量赋值,多重赋值

在go中变量初始化,变量赋值是两种概念。如果使用上面一行代码定义变量,内部会先执行初始化,然后再赋值,变量初始化,只会执行一次,变量赋值会执行多次

var d int
fmt.Printf("d is %d 
", d) // 输出0
d = 100
fmt.Printf("d is %d 
", d) // 输出100
d = 200
fmt.Printf("d is %d 
", d) // 输出200

在go中还支持变量多重赋值,交换变量值非常方便。

	d1 := 1
	d2 := 2
	fmt.Printf("d1 is %d 
", d1)
	fmt.Printf("d2 is %d 
", d2)
	d1, d2 = d2, d1
	fmt.Printf("d1 is %d 
", d1)
	fmt.Printf("d2 is %d 
", d2)
package main

import "fmt"

func main() {
	var d int
	fmt.Printf("d is %d 
", d) // 输出0
	d = 100
	fmt.Printf("d is %d 
", d) // 输出100
	d = 200
	fmt.Printf("d is %d 
", d) // 输出200

	d1 := 1
	d2 := 2
	fmt.Printf("d1 is %d 
", d1)
	fmt.Printf("d2 is %d 
", d2)
	d1, d2 = d2, d1
	fmt.Printf("d1 is %d 
", d1)
	fmt.Printf("d2 is %d 
", d2)
}

匿名变量

假设我们有一个方法,这个方法有多个返回值,这时候我们需要定义多个变量来对返回值进行接收,导致我们定义了很多无用的变量。这个时候我们可以使用_定义一个匿名变量来对返回值进行接收,任何赋予它的值都会被丢弃回收。

package main

import "fmt"

func GetName() (name, nickName string) {
	name = "test"
	nickName = "测试"
  
	return name, nickName
}

func main() {
	_, nickName := GetName()
	fmt.Printf("nickName is %s 
", nickName)
}

变量的作用域

每个定义的变量在程序中都有一定的作用范围,这个我们称之为变量作用域,go中分为全局变量以及局部变量

  • 全局变量:定义在函数体外的变量,我们称之为全局变量。可以在整个包,甚至外部包使用(如果以大写开头),不管你是在那个源文件下调用。
  • 局部变量:在函数体内定义的变量,我们称之为局部变量,局部变量只能在定义的函数体内使用,函数中的参数以及返回值也是局部变量

但你可以在某个代码块的内层代码块中使用相同名称的变量,则此时外部的同名变量将会暂时隐藏(结束内部代码块的执行后隐藏的外部同名变量又会出现,而内部同名变量则被释放),你任何的操作都只会影响内部代码块的局部变量。比如定义了一个全局变量d2,在函数体中再定义一个局部变量d2,修改局部变量d2不会对全局变量有任何影响。

package main

import "fmt"

var d2 = 10

func Test() {
	var d2 = 20
	fmt.Printf("局部变量d2 is %d 
", d2)
}

func main() {
	Test()
	fmt.Printf("全局变量d2 is %d 
", d2)
}