基本类型
在开始之前,先补充一下上一次分享的内容,是不可以重复为变量 foo 初始化赋值的。
foo := 'hello'
foo := "world"
我是一名 web 前端出身的 developer,接触最早也是接触最多还是 javascript ,所以学习任何其他新的语言我都喜欢给 javascript 对比地来学。在 javascript 数据类型中对于数值只有 number 类型也就是 float 类型,而在 go 语言却进行相当细致的划分数值类型,应该是为了效率,节省内存空间吧。更准确地为变量分配内存空间。
int8
int16
int32
int64
float32
float64
关于这些数据类型,我就不做过多解释 int 代表整数型,后面 8 代表的占内存大小也是就是这个数据类型的取值范围,int8 的取值范围为 -128 到 128 之间。
这两类型为一些算法会用到,complex64 为两个 float32 组合,complex128 则为两个 float64 的组合
complex64
complex128
一种无符号的整数类型 uintptr,用于保存内存地址,没有指定具体的 bit 大小但是足以容纳指针。uintptr 类型只有在底层编程是才需要,特别是 Go 语言和 C 语言函数库或操作系统接口相交互的地方。
uintptr
Unicode字符rune类型是和 int32 等价的类型,便于表示一个 Unicode 字符同样byte也是 uint8 类型的等价类型,byte 类型一般用于强调数值是一个原始的数据而不是一个小的整数。
byte // unit8 的别名
rune // int32 的别名
当然还有表示正整数的类型 unit8 前面 u 代表无符号,也就是默认为正那么 unit8 的取值范围就是 0 - 255
unit8
uint16
当然还有默认的没有位数的 int 和 unit,这么多数据类型,让我们感觉到 javascript 对 developer 的贴心。
int
unit
下面介绍一些在给指定数据类型的变量赋值的一些注意事项分别是 overflow 和 underflow
var x:unit8 = 255
x = x + 1 //0 (overflow)
x = 255
x = x + 3 // 2 (overflow)
x = 0
x = x - 1 // 255 (underflow)
x = 4
x = x - 10 // 250 (underflow)
当我们为类型为 unit8 (取值范围0 -255)赋值 255 然后为变量加1后重新为 x 赋值时,这是 x = 256 超出了 unit8 的取值范围,在这种情况编译器会将 x = 0 这就是 overflow 情况也就是变量值溢出了其类型取值范围。
同样对于 underflow 情况当 x = 0 时然后对 x 进行减 1 后重新赋值会得到 x = 255 结果。
有关 float 类型的 overflow 和 underflow 因为精度比较复杂,以后随着深入学习再给大家解释,在此暂时忽略。
var foo int64 = 5;
var bar int32 = 7;
foo = bar; // compile error
不同类型数据是无法相互赋值,我们不能把 int32 类型的 bar 直接赋值给 int64 类型的 foo,需要进行类型转换后进行赋值。
var foo int64 = 5;
var bar int32 = 7;
foo = (int64)bar; // 类型转换
同理,不同类型的变量是无法进行运算的也需要转为同一类型后才可以进行运算。
var foo int64 = 5
var bar int32 = 7
foo = bar +foo; //comile error
var foo int64 = 5
var bar int32 = 7
foo = (int64)bar +foo;
注意的这里 int 类型并不等于 unit8 而且直接赋值给 unit8 类型 bar 需要类型转换,由于 overflow 的原因转换类型后其值也会从 500 变为 244
var foo int = 500
var bar uint8 = uint8(foo); //244
当我们使用 := 对变量初始化赋值时,需要注意其默认的数据类型分别 int 和 float64.
bar := 7 //var bar int = 7
foo := 7.3; //var foo float64 = 7.3
var foo int32 = 5;
var bar int = 7;
bar = foo; // int 和int32 通常是不同的类型
有疑问加站长微信联系(非本文作者)