变量的声明
在Java中我们声明变量的方式为:
int a = 16;
而在Go中,变量的数据类型在变量名后面。
var a int = 16
当然,变量定义和赋值可以放在不同的行。
var a int // 相当于 var a int = 0
a = 32
在一行中,我们也可以声明多个变量。
var a, b int = 3, 2
如果不指定具体类型,系统会判断变量的值,从而给这个变量一个默认类型。
var a = 3 // 相当于 var a int = 3
var b = 0.1 // 相当于 var b float64 = 3.1
var c = true // 相当于 var c bool = true
var d, e = 3, 2.2 // 相当于 var d int = 3; var e float64 = 2.2
还有一种简化的写法:
a := 3
这种简化写法与原来的写法不能完全等价,比如在for循环语句中,不能使用var进行初始化。
for i := 0; i < 3; i ++ {
fmt.Println("aaa")
}
如果用var的话,会报错。
# command-line-arguments
.\main.go:6:10: syntax error: var declaration not allowed in for initializer
类型转换
Go似乎不会进行自动类型转换,当我用int8类型的a与int16类型的b相加时,程序会出现错误。
# command-line-arguments
.\main.go:8:12: invalid operation: a + b (mismatched types int8 and int16)
所以要想实现二者相加,我们需要手动进行类型转换。
var a int8 = 5
var b int16 = 4
var c = a + int16(b)
字符
Go没有char类型,取而代之的是byte,我们可以用下面这种方式来检测一下byte的数据类型。
var a byte = 'A'
fmt.Printf("%T", a)
我们发现,在控制台中,系统打印了一行uint8(无符号8位整型数),由此我们可以认为byte是uint8的别名。
如果我们直接打印变量上面代码中的变量,我们只会得到它的整数值,那么要怎样才能得到这个字符呢?通过Printf格式化输出。
var a byte = 65
fmt.Printf("%c", a)
数组
对于数组,我们可以通过以下方式进行声明:
var a [3]int = [3]int{1, 2}
var b = [2]int{0, 1}
a := [2]int{1}
上面的的数组中,{}中的数值与数组中前部分连续的元素相匹配,如果我们知道的元素值并非连续的,我们可以为数值前面加上索引。
var a = [6]int{1, 3, 4:6, 5:7}
我们也可以将定义和赋值分开。
var a [3]int
a[0] = 1
a[1] = 3
数组中的元素的默认值与元素的数据类型相关,例如,int类型的元素,其默认值为0。
如果我们在{}中输入的所有的元素,那么在[]中便可以用…替代数组的长度。
a := [...]int{1, 2, 3, 4}