Golang | 变量
变量
变量的定义
变量是几乎所有的编程语言中最基本的组成元素。从根本上来说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。
在Go语言中,变量和其它的C语言系的语言都是不同的,看下面的声明就知道了。
变量的声明
Go语言
的变量的声明和 js
和像,也是使用var
来进行标识的。
但是Go语言是静态类型语言,因些,变量是具有明确类型的,编译器也会检查变量类型是否正确。
格式为:
var 变量名 类型
Go语言和许多C类型的语方是不同的,它的声明变量时将变量的类型放在变量名的后面,因为Go语言的设计者认为我们在写代码的时候,主要关注的是变量的命名,所以把变量名放在前面
,这样做的好外有就是在一次性声明多个变量的时候,可以很清楚的表现出来。
在Go语言中变量名由
数字
,字母
,下划线
组成,其中数字不能为首字母
。
例:
var v1 string
这就量个Go语言的变量的定义,注意:在Go语言中每一句后面是不用加上分号(;)的
,和其它的强类型语言相比,Go语言摒弃了语句必须以分号作为语句结束标记的习惯。
var
关键字的另一程用法就是可以将若干个需要声明的变量放置在一起,避免在书写的时候需要重复写var
关键字:
例:
var (
v1 int
v2 string
)
变量的初始化
在Go语言中变量的初始化有三种方式,在定义的时候,变量需要进行初始化的场景,var
关键字可以保留,也可以不用,但不再是必要的元素:
例:
var v1 string = "abc"
var v2 = "abc"
v3 := "abc"
上面三种方式定义出来的义变是完全相同的,但是写法不一样,除了第三种方式不能声明全局变量以外,另外两种都可以,但是在方法中的时候,第三种与第一种相比,需要输入的字符数大大减少,是聪明程序员的最佳选择
。
第二种方法和第三种方法都没有规定变量的类型,这里说明,Go语言中变量的类型不再是必需的,Go编译器可以从初始化表达式的右值推导出该变量应该声明为那种类型。
并且Go语言的变量在初始化的时候,可以同时初始化多个不同类型的变量:
v1 , v2 := 1 , "str" //第一个类型是int类型的,第二个类型是string类型的。
fmt.Println(v1 , v2)
注意:
在 := 左侧的变量不应该是已被声明过的,否则会导致编译错误。
例:
v1 := "老酒馆的猫"
//v1 := "老酒馆" //错误的例子
//但是有一种方法可以让已经是声明过的变量再声明的不会报错。
v1 , v2 := "老酒馆" , "的猫"
fmt.Println(v1 , v2)
变量的赋值
在Go语法中,变量初始化
和变量赋值
是两个概念,初始化是定义一个变量的时候,就把一个变量给定了值,但是赋值是在声明以后才进行的:
例:
// 变量赋值
var str string
str = "老酒馆的猫"
单个变量的赋值和其它语言中的赋值是一样的,但日Go语言中有其它语言不具备的,就量两个变量可以相互的交换值:
// 变量初始化
a := 10
b := 20
a , b = b , a
fmt.Println(a,b) //20 , 10
在别的语言中,必须有一个中间数来进行值的交换,比如:
int a = 10;
int b = 20;
int c;
c = a;
a = b;
b = c;
这个时候就定义了一个无用的变量,并且语法上面还没有Go语言来的简洁,直观,性能上也不如。
匿名变量
在Go语言中,我们如果在定义函数的时候,我们有不想要的变量,我们就可以把这个变量抛弃掉,不用这个变量,基本上屏蔽掉了可能混淆阅视听的内容,从而大幅度提并了沟通的效率,和代码维护的难度。
例:
func getTime() (hour , minute , second int){
return 12 , 23 , 55
}
这个时候,我们只想获取小时,我们可以这样:
hour , _ , _ = getTime()
就如上面这样就可以了,这样就可以把另外两个变量给抛弃了,这就叫匿名变量
。
变量的存储和生命周期
Go语言提供自动内存管理
,通常我们不需要特别关注变量的生存期和存放的位置,编译器会使用栈逃逸技术
能够自动为变量分配内存空间:可能在栈
上,也可能在堆
上。
变量的作用域
变量的作用域指的是一个变量生效的范围,跟据这个定义,我们可以把变量分为全局变量
,局部变量
。
例:
// 全局变旺
var gg string = "abc"
func main() {
var s int = 1
fmt.Println(gg) // abc
var gg int = 100
fmt.Println(gg) // 100
{
var s string = "str"
fmt.Println(s) // str
}
fmt.Println(s) //1
}
上面这个例子就是说明不用的局部变量作用域内的变量之间互相之间是没有影响的,但是全局变量和局部变量之间会符合一种就近原则,就是如果在使用之前对全局变量进行全新的定义,那么就会使用全新的定义。
关注公众号,随时获取最新资讯
细节决定成败!
个人愚见,如有不对,恳请斧正!