Golang的基础数据类型

avatar 2020年3月28日18:05:13 评论 1,344 次浏览

在说到数据类型之间我们先聊一下什么是数据类型,数据类型是一个值,这个值可能是字符串,可能是整数,也可能是浮点数等。这个值是存储在内存中的,如果想获取这个值,需要使用变量名指引到内存中的值,数据类型和变量名没有关系,有关系的是变量指引的值,这就是我们常说的变量赋值。

变量

了解了数据类型的值是有变量指引到内存地址的一个过程,把变量的值指引给一个变量的过程就是变量的赋值。变量的赋值方法有,直接赋值,先声明数据类型在进行赋值,同一数据类型多个变量进行赋值等等。我们先看看变量的数据类型有哪些?

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等类型。这些我们会在后面的学习中用到的时候特别提出来,这里先不描述。知道了数据类型,那么如果进行转换呢?

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: