Go 基础数据类型 (1)整型

整型


我们经常看到这样的变量声明:

var (
    a int 
    b string
    c float32
)

在Go中所有变量都是有类型的, 比如前面的int, string, float32 这些, 因此在接下来我们将先讲解下Go的基础类型

go在语言成面定义了如下几种基础类型:

  • 整形 12345
  • 浮点型 123.45
  • 复数 123.45i
  • 字符 'a'
  • 字符串 "abc"
  • 布尔类型 true, false
  • 枚举类型 iota
  • 自定义类型

Go语言的数值类型包括几种不同大小的整形数、浮点数和复数。每种数值类型都决定了对应的大小范围和是否支持正负符号。让我们先从整形数类型开始介绍。

Go语言同时提供了有符号和无符号类型的整数运算。 这里有int8、int16、int32和int64四种截然不同大小的有符号整形数类型,分别对应8、16、32、64bit大小的有符号整形数,与此对应的是uint8、 uint16、uint32和uint64四种无符号整形数类型。

这里还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint;其中int是应用最广泛的数值类型。这两种类型都有同样的大小,32或64bit,但是我们不能对此做任何的假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。

Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。这两个名称可以互换使 用。同样byte也是uint8类型的等价类型,byte类型一般用于强调数值是一个原始的数据而不是一个小的整数。

最后,还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。uintptr类型只有在底层编程是才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。我们将在第十三章 的unsafe包相关部分看到类似的例子。
不管它们的具体大小,int、uint和uintptr是不同类型的兄弟类型。 其中int和int32也是不同的类型,
即使int的大小也是32bit,在需要将int当作int32类型的地方需要一个显式的类型转换操作 ,反之亦
然。  

 一般来说,需要一个显式的转换将一个值从一种类型转化位另一种类型,并且算术和逻辑运算的二元操作中必须是相同的类型。虽然这偶尔会导致需要很长的表达式,但是它消除了所有和类型相关的问题,而且也使得程序容易理解。

在很多场景,会遇到类似下面的代码通用的错误:
var apples int32 = 1 
var oranges int16 = 2 
var compote int = apples + oranges // compile error

当尝试编译这三个语句时,将产生一个错误信息:

invalid operation: apples + oranges (mismatched types int32 and int16)
这种类型不匹配的问题可以有几种不同的方法修复,最常见方法是将它们都显式转型为一个常见类型:
var compote = int(apples) + int(oranges)

对于每种类型T,如果转换允许的话,类型转换操作T(x)将x转换为T类型。许多整形数之间的相互转换并不会改变数值;它们只是告诉编译器如何解释这个值。但是对于将一个大尺寸的整数类型转为一个小尺寸的整数类型,或者是将一个浮点数转为整数,可能会改变数值或丢失精度:

f := 3.141 // a float64 
i := int(f) 
fmt.Println(f, i) // "3.141 3" 
f = 1.99 
fmt.Println(int(f)) // "1"

浮点数到整数的转换将丢失任何小数部分,然后向数轴零方向截断。

扩展


进程内存结构:

mem_struct

  • 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象)
  • 堆: 存放用new产生的数据

值类型和引用类型 是什么?

  • 值类型: 这段内存里面存储的是基本类型的数据, 比如 "a", 10, 0.01
  • 引用类型: 这段内存里面存储的是一个地址, 比如 0xc00011e370 0xc00011e380

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/121843775