在说到数据类型之间我们先聊一下什么是数据类型,数据类型是一个值,这个值可能是字符串,可能是整数,也可能是浮点数等。这个值是存储在内存中的,如果想获取这个值,需要使用变量名指引到内存中的值,数据类型和变量名没有关系,有关系的是变量指引的值,这就是我们常说的变量赋值。
变量
了解了数据类型的值是有变量指引到内存地址的一个过程,把变量的值指引给一个变量的过程就是变量的赋值。变量的赋值方法有,直接赋值,先声明数据类型在进行赋值,同一数据类型多个变量进行赋值等等。我们先看看变量的数据类型有哪些?
bool byte complex64 complex128 error float32 float64 int int8 int16 int32 int64 rune string uint uint8 uint16 uint32 uint64 uintptr
这些数据类型,也就是本章要学的,Golang的基础数据类型。我们知道了Golang中有这些数据类型,如果自己定义的变量值已经知道了,但是如何反射,根据变量值判断变量的数据类型呢?这里就需要扩展一个知识点reflect包,reflect包中有一个TypeOf方法可以直接获取变量的数据类型。看下面的例子:
package main import "fmt" import "reflect" // 吴老二 个人博客地址 http://www.wulaoer.org func main() { wulaoer := "www.wulaoer.org" fmt.Println("获取变量wolf的数据类型是:",reflect.TypeOf(wulaoer)) }
输出结果:
获取变量wulaoer的数据类型是: string
定义的变量wulaoer,没有申明变量类型,直接赋值给一个字符串,使用了reflect包的TypeOf方法,根据变量值进行反射数据类型。也可以使用函数的参数interface{}利用%T来反射,如下例子:
package main import "fmt" // 吴老二 个人博客地址 http://www.wulaoer.org func main() { v := "www.wulaoer.org" fmt.Printf(typeof(v)) } func typeof(v interface{}) string { return fmt.Sprintf("%T",v) }
输出结果:
string
其实这两种方法都使用reflect包的TypeOf方法,reflect.TypeOf()的参数是v interface{}。interface也是一个结构体,记录了两个指针分别是指向变量的类型和变量的value。根据这些数据类型获取方法就可以进行操作学习了。
布尔类型(bool)
布尔类型的值只可以是常量True和False,一般使用bool表示,主要是针对判断使用的。判断的结果为真,则返回True,为假,则返回False。看下面的例子:
package main import "fmt" // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var wulaoer int wulaoer = 27 if (wulaoer == 27){ fmt.Println("bool类型为真") } else if ( wulaoer != 27 ) { fmt.Println("bool类型为假") } }
输出结果:
bool类型为真
这里使用了if判断,判断中使用了运算符等于"=="和不等于"!=",前面已经申明的变量值是27,所以判断的结果肯定为真。在bool类型中还可以使用和"&&", "AND"和 "||","OR"等操作符进行操作。如果运算符左边的值可以确定整个布尔表达式的值,那么运算符右边的值将不在被求值。
字符串(string)
上面的测试,使用了字符串,这里介绍一下字符串的作用,字符串是一个不可改变的序列,字符串中可以包含任意的数据,包括byte值0。Golang给字符串内置了一个函数len()返回字符串的长度,也可以根据索引返回字符串的字节值,这点和python中的字符串很像。字符索引的起始位置是从0开始,len(wulaoer)结束,如果想连接两个字符串也可以使用运算符"+"进行连接,生成一个新的字符串。字符串也可以使用"=="和"<>"进行比较。看下面的例子:
package main import ( "fmt" "reflect" ) //吴老二 个人博客地址 http://www.wulaoer.org func main() { var wolf string wolf = "wulaoer" //这里赋值变量使用的是"=" fmt.Println("打印字符串的值和长度:",wolf,len(wolf)) nums := wolf[0] //这里赋值变量使用的是":=" fmt.Println("打印切片字符串的类型:",reflect.TypeOf(nums)) fmt.Println("切片后的字符:",string(nums)) wulaoer := wolf wulaoer += ".org" fmt.Println("合并后的字符以及长度:",wulaoer,len(wulaoer)) }
输出结果:
打印字符串的值和长度: wulaoer 7 打印切片字符串的类型: uint8 切片后的字符: w 合并后的字符以及长度: wulaoer.org 11
首先,字符串切片后赋值给了nums变量,但是nums变量的类型是uint8,我尝试切片字符串[1:3],在打印nums变量时,是切片后的字符串。而且变量nums的数据类型也是string类型了。这是因为在Golang中,字符串底层是字节数组,而byte是uint8的别名,所以需要进行一下转换才会显示string。
数字类型
数字类型分为整数和浮点数,整数有详细分为有符合整数和无符号整数。有符合整数类型包含:
* int - 有符合 32位系统4个字节 64位系统8个字节 参考int32和int64 * rune - 有符合 等价于int32 -2^31 ~ 2^31 -1 表示一个unicode码 * int8 - 有符号 8 位整型 (-2^7 ~ 2^-1 即:-128 到 127) 占用1字节 * int16 - 有符号 16 位整型 (-2^15 ~ 2^15 -1 即:-32768 到 32767) 占用2字节 * int32 - 有符号 32 位整型 (-2^31 ~ 2^31 -1 即:-2147483648 到 2147483647) 占用4字节 * int64 - 有符号 64 位整型 (-2^63 ~ 2^63 -1 即:-9223372036854775808 到 9223372036854775807) 占用8字节
无符号整数类型包含:
* uint - 无符合 32位系统uint32 64系统uint64 参考uint32和uint64 * byte - 无符合 等价于uint8 0 ~ 255 存储一个ascii字符用 * uint8 - 无符号 8 位整型 ( 0 ~ 2^8 - 1 即:0 到 255) 占用1字节 * uint16 - 无符号 16 位整型 (0 ~ 2^16 - 1 即:0 到 65535) 占用2字节 * uint32 - 无符号 32 位整型 (0 ~ 2^32 - 1 即:0 到 4294967295) 占用4字节 * uint64 - 无符号 64 位整型 (0 ~ 2^64 - 1 即:0 到 18446744073709551615) 占用8字节
Golang的整型默认位是int,字节大小可以使用unsafe.Sizeof(var_name)进行查看,使用%T来查看类型。建议在使用的时候尽量选择占用空间小的数据类型,确保不溢出。如果申明变量类型不管是有符合还是无符合的整数类型,变量的空间超出范围,超过就会出现"constant 256 overflows int8"的错误。看下面的例子:
package main import "fmt" // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var wulaoer int8 wulaoer = -100 fmt.Println("在有符合范围内的整数:",wulaoer) }
输出结果:
在有符合范围内的整数: -100
bit是单位计算机最小的存储单元,byte是最基本的存储单元,1byte等于8bit。
浮点数
浮点数就是我们所说的小数,分为float32位和float64位,32位的占用4个字节,64位的占用8个字节。浮点数默认什么为float64,推荐使用float64比较精确。浮点数的两种表示方法分别是十进制表示,科学记数法。看下面的例子:
package main // 吴老二 个人博客地址 http://www.wulaoer.org import ( "fmt" "math" ) func main(){ for w:=0;w<8;w++{ fmt.Printf("浮点数:w = %d l = %g e^w = %8.3f\n",w,float64(w),math.Exp(float64((w)))) } }
输出结果:
浮点数:w = 0 l = 0 e^w = 1.000 浮点数:w = 1 l = 1 e^w = 2.718 浮点数:w = 2 l = 2 e^w = 7.389 浮点数:w = 3 l = 3 e^w = 20.086 浮点数:w = 4 l = 4 e^w = 54.598 浮点数:w = 5 l = 5 e^w = 148.413 浮点数:w = 6 l = 6 e^w = 403.429 浮点数:w = 7 l = 7 e^w = 1096.633
这里使用%d格式化整数,%g格式化浮点数,%e格式化指数,%f打印对应表格。这里说的是目前最基本的数据类型,我们可以先进行了解一下,还有一些其他的数据类型,比如byte,rune,uintptr以及指针,数组还有map等类型。这些我们会在后面的学习中用到的时候特别提出来,这里先不描述。知道了数据类型,那么如果进行转换呢?
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏