我这边先把GO语言中的数据类型都快速梳理出来,为了和C++有一个对比,有了数据类型,才有后面对变量和常量的一些定义。
整型
序号 |
类型 |
描述 |
1 |
uint8 |
无符号8位整型(0-2^8 - 1),1个字节 |
2 |
uint16 |
无符号16位整型(0-2^16 - 1),2个字节 |
3
扫描二维码关注公众号,回复:
11388475 查看本文章
|
uint32 |
无符号32位整型(0-2^32 - 1),4个字节 |
4 |
uint64 |
无符号64位整型(0-2^64 - 1),8个字节 |
5 |
int8 |
有符号8位整型(-2^7 - 2^7 - 1),1个字节 |
6 |
int16 |
有符号16位整型(-2^15 - 2^15 - 1),2个字节 |
7 |
int32 |
有符号32位整型(-2^31 - 2^31 - 1),4个字节 |
8 |
int64 |
有符号64位整型(-2^63 - 2^63 - 1),8个字节 |
浮点和复数类型(浮点型只有这两种类型,float64相当于C++里的double)
序号 |
类型 |
描述 |
1 |
float32 |
32位浮点型数 |
2 |
float64 |
64位浮点型数 |
3 |
complex64 |
32位实数和虚数 |
4 |
complex128 |
64位实数和虚数 |
其他整型数据类型
序号 |
类型 |
描述 |
1 |
byte |
字节类型,类似uint8 |
2 |
rune |
类似int32,用来表示字符类型(也是C++里的char,只不过这里的rune不像char一样是1个字节8位了,而是4个字节32位,主要是为了多种字符类型共通性,比如utf-8字符集中很多字符是2字节,也有3字节的) |
3 |
uint |
32位或64位无符整型(也就是C++里平时常用的unsigned int,具体几位看32位平台还是64位平台) |
4 |
int | 32位或64位有符号整型(也就是C++里平时常用的int,具体几位看32位平台还是64位平台) |
5 |
uintptr |
无符号整型,用于存放一个指针,GO语言中也有指针 |
布尔型(bool),这个类型只有两个值true和false,而且注意的一点是,GO不像C++,C++中bool类型可以用1或0来表示true和flase,比如在一个if语句的条件中,它希望接收的是一个布尔表达式,但是我们可以直接用一个数值1或大于0的数来表示true,数值0或小于0的数来表示false。而在GO语言中则不可以这样赋值。
func main() {
var b bool = 1
}
在编译期间,编译器就直接报错了,所以这一点是需要注意的地方。
.\main.go:5:6: cannot use 1 (type int) as type bool in assignment
另外还有string类型,C++中string是当作一个类来使用的,在命名空间std中的(std::string),而GO语言是直接将string设定为了一个内置类型。
另外GO语言对于字符的统一编码格式是utf-8。
强制类型转换
之前说过GO语言是一个强类型语言,变量的使用必须声明类型。而变量的类型转换也是强制的,没有像C++这样的有隐式类型转换。
来看下面这样一段C++代码
int func(double a){
return a;
}
int main(){
int a = 1;
cout << func(a) << endl;
return 0;
}
这边给了一个函数func,它接收的参数是一个double类型,返回类型是一个int类型。这边函数内部直接将这个double类型的参数作为返回值返回了,这里就有一个隐式类型转换,把double类型隐式转换成了int类型来返回。
而在传参的时候,我是用一个int类型作为参数传进去的,也发生了隐式类型转换,将int类型隐式转化成了double类型。
所以在C++中,隐式类型转化是允许的。但是,GO就不同了。
func add(a float64,b float64) int {
return a + b
}
func main() {
var a,b float64 = 1.0,2.1
fmt.Println(add(a,b))
}
上述函数中,函数add的返回值是一个int,而我们直接将两个float64参数相加的结果直接返回了,它的结果还是一个float64,我们想让它能像C++一样发生隐式类型转换,但是不行,因为GO只允许强制类型转换,所以上面的代码,编译器肯定会报如下错误。
.\main.go:6:11: cannot use a + b (type float64) as type int in return argument
如果我们用了强制类型转换,上述代码就可以通过
func add(a float64,b float64) int {
return int(a + b) //强制类型转换
}
func main() {
var a,b float64 = 1.0,2.1
fmt.Println(add(a,b))
}
因此,程序输出了下面代码
3 //本来是3.1,这里会失去精度,从浮点型变成了整型,所以输出了3
所以需要注意的是,GO只支持强制类型转换,不支持隐式类型转换!
另外,强制类型转换只能发生在两个兼容类型之间,比如int和float64就是两个兼容类型,而int和string之间就不可以发生强制类型转换了
好了,再注意一个问题,我们平时用int用的比较多,但如果你的机器是64位的,在GO语言中你创建一个int类型的变量就是一个int64的变量,是8个字节的,如果创建了很多这样的变量,很可能会造成一些空间的浪费,因此,具体使用什么类型的变量,还是要根据不同情况不同分析。