由于我以前是学的C/C++语言,所以在博客中会将Go与C/C++进行对比来学习:
Go语言作为C语言家族的新派代表,在C语言的定义方法和类型上做了优化和调整,更加灵活易学。今天首先从最简单的变量声明开始进行学习:
1.三种声明方式
普通变量的声明有三种方式,第一种和第二种通过关键字var来声明变量,第三种则靠编译器进行推断,分别如下:
var i int = 12 //明确定义i为int类型
var i = 12 //自动识别i为int类型
i := 12 //自动推断变量i为int类型
注意:由于使用了:=,而不是赋值的=,因此推导声明写法的左值变量必须是没有定义过的变量,如果定义过,则会发生编译错误。如下在一个语句块中同时出现以下两条语句就会报错:
var i int = 12
i := 12 //报错,i已经声明过了,将:=改为=,正确
这里有一个注意的地方就是,使用上面第二种和第三种方式时,等号右边必须是明确类型的值,可以让编译器推断出来。
2.批量声明不同类型的变量
var (
a int
b string
f func() bool //声明一个函数变量,返回值为bool。等价于C语言里面函数指针的声明
e struct {
x int
}
)
以上声明等价于:
var a int
var b string
var f func() bool
var e struct {
x int
}
3.批量声明/初始化相同类型的变量
var a, b, c, d int = 1, 2, 3, 4
等价于:
var a int = 1
var b int = 2
var c int = 3
var d int = 4
通过上面的同时给多个变量初始化,我们可以得到启示,用一行代码来完成C语言中需要三行代码的交换:
a, b = b, a //交换了a和b的值
4.声明匿名变量
func GetData() (int, int) {
return 100, 200
}
a, _ := GetData() //a=100,200被匿名变量接收,放弃使用
_, b := GetData() //b=200, 100被匿名变量接收,放弃使用
fmt.Println(a, b) //输出100, 200
注意:匿名变量不占用命名空间,不会分配内存。
5.常量的声明与初始化
6.变量类型
(1)整型
按长度分为:int8、int16、int32、int64
对应的无符号整型:uint8、uint16、uint32、uint64
如果没有明确指明长度,则其根据平台的位数决定,如:
int和uint在32位平台上占4个字节,在64位平台上占8个字节
(2)浮点型
Go语言支持两种浮点型数:float32 和 float64。这两种浮点型数据格式遵循 IEEE 754 标准:
float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32。
float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64。
(3)bool类型
Go中以bool声明布尔型数据,布尔型数据只有true和false两个值。
但是Go语言和C语言不同,不允许将整型强制转换为布尔型。
布尔型无法参与数值运算,也无法与其他类型进行转换。
(4)字符串
Go语言字符串和C++中string有所不同,其中最大的不同就是Go语言中字符串无法直接通过下标修改每一个字符元素,只能通过重新构造新的字符串并赋值给原来的字符串变量实现。如下:
str := "hello"
str[0] = 'f' //错误,无法通过下标访问
strBytes := "=[]byte(angel) //正确
strBytes[0] = 'f'
str = string(strBytes)
关于字符串的相关操作后面再专题详细介绍。
(5)byte和rune
Go语言的字符有以下两种:
a).一种是uint8类型,或者叫byte类型,代表了一个ASCII码的一个字符。等价于C语言中unsigned char
b).一种是rune类型,代表UTF-8字符,底层是int32类型。用来处理中文、日文等复合字符。
(6)常量
a).常量的声明
常量的声明和变量声明非常类似,只是把var换成了const
const pi = 3.1415926
注意:常量必须在编译时就确定其值,所以常量也可以用于数组声明