变量声明
go中声明变量有诸多方式,个人感觉花里胡哨的,接下来就来看看吧。
Go中的数据类型
提到变量就不得不先提到Go中的数据类型,几种常用的数据类型几乎在每个编程语言中都会有,但他们还是有一些区别的。
Go中数据类型分为数值类型、浮点类型、字符、字符串、布尔、指针、数组、切片以及map几大类,详细介绍及用法在后面的文章中会一一提到。
几种声明变量的方法
首先在项目下新建一个包,idea中对于go语言new的选项中并没有package,我们直接new一个目录就好了。接着新建一个go文件,这里就叫main.go吧。
接着先将pacakge后的包名改为main,为什么要改这里先不说:
package main
接着声明一个名为main的函数,可以理解为java中声明一个main方法:
func main(){}
接下来就是声明变量的几种方法了。
var 变量名 变量类型
此种声明方式我愿称为是最正经的声明方式,但写惯了java看上去还是有些别扭,因为它将数据类型放在了变量名后:
var variable int
在idea中声明变量你会发现,变量名下爆红了,看他的报错提示可以得知,Go语言中变量一旦声明就必须要使用,否则就会报错。这种声明方式下我们并没有对它进行赋值,而在Go中数值类型的默认值为0。
var 变量名=值
是的,你没看错,这是go语言,但这种声明方式是不是想到了js中声明一个变量,此种方式声明变量和js一样,系统会进行类型推断,通过变量的值自行确定它的类型。
var variable2=100
变量名:=值
这种声明方式就比较另类了,也称为简短声明,但它有约束条件,只能在函数内部声明
variable3:="风间天道"
var 变量1,变量2,变量3,变量4=值1,值2,值3,值4
这种方式适用于同时声明多个变量:
var variable4,variable5,variable6,variable7=1,"风间天道",3.14,false
接下来我们将他们全部输出:
fmt.Println(variable1)
fmt.Println("声明多个变量:",variable1,variable2,variable3,variable4,variable5,variable6,variable7)
结果:
声明多个变量: 0 风间天道 100 1 fengjian 3.14 false
接下来提一个变量方面小小的区别:
在使用java时,如果我们要将两个变量的值互换,那么需要借助第三个临时变量完成。而在Go中则可以直接完成:
//交换两数的值
var i=100
var j=200
fmt.println("i和j交换位置前:",i,j)
i,j=j,i
fmt.println("i和j交换位置后:",i,j)
运行:
i和j交换位置前: 100 200
i和j交换位置后: 200 100
可以发现两数的值的确是改变了,而且可以发现,又和js一样,每行语句结尾是可以不用写;的。
使用下划线忽略变量
有时候我们声明了多个变量,但在某些变量又没有必要在某个需求中使用,那么我们就可以使用_作为占位符来替换这个不需要使用的变量,它也就不会被使用到:
_,x=22,100
大小写对于变量和函数的影响
使用过java语言的同学都知道,java中的变量和方法有权限的概念,比如被public修饰的变量和方法能够被其他包中的成员访问到,而在Go中,通过变量和方法的首字母大小写也可以实现类似的功能:
//首字母大写的变量和属性能够被其他包读取,反之只能被本包中的文件读取
Variable8:=100
常量
常量可以理解为是不可变的变量,一经声明无法修改。而常量的运算在编译期间就已完成。Go中通过const关键字来声明常量,其声明方式和声明变量相同,并且常量可以只声明但不使用而不会报错。
const const1 float64=3.1415926
const consst2,const3=100,"风间天道"
而在Go中,有三个常量true、false、iota,是预先就定义好的:
fmt.println(true,false)
这里重点说一下iota:
iota是用作常量的计数器,只能在常量中使用。接下来用例子一一解释他的几个特点。
iota的值可变
const{
iota1=iota
iota2=iota
iota3=iota
}
const iota4=iota
fmt.Printf("iota1=%d,iota2=%d,iota3=%d,iota4=%d\n",iota1,iota2,iota3,iota4)
结果:
iota1=0,iota2=1,iota3=2,iota4=0
可以看出,iota的值会发生改变,而从严格意义上说,可以描述成:
- iota紧跟在const第一行时,值为0
- 往后每出现一行,iota值自增1
- 当再次遇见const时,iota重置为0
再次举例:
const{
iota5=iota
iota6
iota7
}
fmt.Printf("iota5=%d,iota6=%d,iota7=%d\n",iota5,iota6,iota7)
结果:
iota5=0,iota6=1,iota7=2
从上面的例子可以看出,iota的自增只与常量const中的行数有关,不一定要每一行都出现iota
这个例子也是如此:
const(
iota11=iota
iota12="fengjian"
iota13=iota
)
fmt.Printf("iota11=%d,iota12=%v,iota13=%d\n",iota11,iota12,iota13)
运行:
iota11=0,iota12=fengjian,iota13=2
iota并没有出现在每一行,但它依旧会计数
再看下一个例子:
const{
iota8,iota9,ioat10=iota,iota,iota
}
fmt.Printf("iota8=%d,iota9=%d,iota10=%d\n",iota8,iota9,iota10)
结果:
iota8=0,iota9=0,iota10=0
由于三个iota都在const后的第一行,所以iota的值并不发生改变,都为0
这里可以借用iota的特点,实现类似java中枚举的功能:
const{
Sunday=iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
}
fmt.Println(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday)
运行结果:
0 1 2 3 4 5 6