GO学习笔记——GO基本数据类型(4)

我这边先把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个字节的,如果创建了很多这样的变量,很可能会造成一些空间的浪费,因此,具体使用什么类型的变量,还是要根据不同情况不同分析。

猜你喜欢

转载自blog.csdn.net/lvyibin890/article/details/83141891