说完了变量与声明,接下来要讲讲Golang里面的数据类型,Golang里面的数据类型分成基础类型、聚合类型、引用类型和接口类型。基础类型包括数字、字符串和布尔型;聚合类型包含数组和结构体,它是通过组合各种简单类型而得到的更复杂的数据类型;引用类型包含指针、slice、map、函数以及通道;接口类型将会在后面的篇章进行讲解。学到C语言的人都知道,在计算机的世界里,分为整数、浮点数和复数,在Go里面也一样,分为整数、浮点数和复数。
对于整数来说有两种类型:有符号整数和无符号整数,有符号整数有8位、16位、32位、64位的,用int8、int16、int32、int64表示,无符号整数有对应的uint8、uint16、uint32、uint64表示。此外还有int和uint,目前来说int是使用较为广泛的数值类型。值得注意的是,对于二元运算符,其操作数的类型必须相同,int32和int16也不能相加,比如var a int32 = 1; var b int16 = 3; 那么a+b编译就会报错,因为int32和int16类型不匹配,想要相加就要转化为同一类型的数据,比如var sum = int(a) + int(b)。
对于浮点数来说就没有直接float的类型,对于它来说只有两种:float32和float64,float32的最大值大约是3.4e38(也就是3.4*10^38),而float64的最大值为1.8e308(也就是1.8*10^308),其算数特性遵从IEEE 754标准(参考:https://zh.wikipedia.org/wiki/IEEE_754,需要梯子)。
对于复数,Golang里面分为complex64和complex128,内置的real函数和imag函数则分别用作提取复数的实部和虚部,比如var x complex128 = complex(1,2)表示1+2i,var y complex128 = complex(3,4),fmt.Printon(x*y)的值就是-5+10i,fmt.Println(real(x*y))就是-5,fmt.Println(imag(x*y))就是10。
对于布尔值,Golang的布尔值和Node.js或者C的布尔值没有什么差别,只有两个值true和false,布尔值无法隐式转化为数值,数值也不能隐式转化为布尔值,需要通过函数进行转换。
对于字符串类型,Golang就自带这种类型的数据,提供的一些方法也很实用,而且它直接支持utf-8的编码,使用起来更加方便,比如声明一个字符串s:="hello, world",想取长度就可以调用len方法,比如len(s),想获取子串,就直接在字符串变量后面写[i, j],i代表起始的下标,j代表结束的下标。有个地方需要留意,当两个字符串拼到一起,做加法运算的时候,得到的新字符串和原来的两个字符串公用一段底层的内存,没有重新分配新的内存,这样使得复制任何长度字符串的开销都低廉。比如str1 := "hello"; str2 : "world"; str3 += str2; 最终拼凑出来的是helloworld,但是它的起始地址和str1的起始地址一致。
说完了数据类型,那二元操作符的优先级是怎么样的?先乘除后加减,这句古话是我们平时学数学的时候背过的一句话,在计算机的世界里我们同样遵循一样的规律,除了加减乘除,我们还有很多很多的二元运算符,具体的优先级排序如下:
+ / % 《 》 & &^
+ - | ^
== != < <= > >=
二元运算符分为五大优先级,同级别的运算符满足左结合规律,算术运算符+、-、*、/可应用于整数、浮点数和复数,而取模运算符%仅可用于整数,取模余数的正负号总是和被除数一致,所以-5%3和-5%-3都是等于-2,除法运算(/)的行为取决于操作数是否都为整数,整数相除,商会舍弃小数部分,比如。5.0/4.0=1.25,而5/4等于1。有了上面的这些基本数据类型及其相关的运算,我相信已经在平时的生活和工作当中够用的了,有些内容和Node.js相差还是蛮大的,需要多多练习,尽快熟悉这部分的内容。
有疑问加站长微信联系(非本文作者)