设为首页 加入收藏

TOP

Go基础系列:简单数据类型(一)
2018-10-27 22:08:48 】 浏览:301
Tags:基础 系列 简单 数据 类型

每一个变量都有数据类型,Go中的数据类型有:

  • 简单数据类型:int、float、complex、bool和string
  • 数据结构或组合(composite):struct、array、slice、map和channel
  • 接口(interface)

当声明变量的时候,会做默认的赋0初始化。每种数据类型的默认赋0初始化的0值不同,例如int类型的0值为数值0,float的0值为0.0,string类型的0值为空"",bool类型的0值为false,数据结构的0值为nil,struct的0值为空结构。

其实函数也有类型,不过一般称之为返回类型。例如,下面的函数foo的返回类型是int:

func foo() int {
    ...CODE...
    return INT_TYPE_VALUE
}

函数允许有多个返回值,它们使用逗号分隔,括号包围:

func foo() (int,bool)

Number类型

Integer

Integer类型是整型数据,例如3 22 0 1 -3 -22等。

Go中的Integer有以下几种细分的类型:

  • int8,int16,int32,int64
  • uint8,uint16,uint32,uint64
  • byte
  • rune
  • int,uint

其中8 16 32 64表示该数据类型能存储的bit位数。例如int8表示能存储8位数值,所以这个类型占用1字节,也表示最大能存储的整型数共2^8=256个,所以int8类型允许的最大正数为127,允许的最小负数为-128,共256个数值。

uint中的u表示unsigned,即无符号整数,只保存0和正数。所以uint8能存储256个数的时候,允许的最小值为0,允许的最大值为255。

额外的两种Integer是byte和rune,它们分别等价于uint8(即一个字节大小的正数)、int32。从builtin包中的定义就可以知道:

$ go doc builtin | grep -E "byte|rune"
type byte = uint8
type rune = int32

byte类型后面会详细解释。

还有两种依赖于CPU位数的类型int和uint,它们分别表示一个机器字长。在32位CPU上,一个机器字长为32bit,共4字节,在64位CPU上,一个机器字长为64bit,共8字节。除了int和uint依赖于CPU架构,还有一种uintptr也是依赖于机器字长的。

一般来说,需要使用整型数据的时候,指定int即可,有明确的额外需求时再考虑是否换成其它整数类型。

在整数加上0前缀表示这是8进制,例如077。加上前缀0x表示这是16进制,例如0x0c,使用e符号可以表示这是一个科学计数法,如1e3 = 1000,6.023e23 = 6.023 x 10^23

可以使用TYPE(N)的方式来生成一个数值,例如a := uint64(5)。实际上这是类型转换,将int类型的5转换成int64类型的5。

byte类型

byte类型等价于uint8类型,表示无符号的1字节整数。

实际上它一般用来表示字符和数值的转换关系。例如,ASCII的字母a表示97。下面这种定义方式是允许的:

var a byte = 'A'  // a=65
var b uint8 = 'a' // b=97

注意,字符必须使用单引号,且必须只能是单个字符。所以byte类型经常被称为character类型。

以下也都是允许的:

var a = 'A'
var a uint32 = 'A'
var a int64 = 'A'

所以,Integer类型当存储的是以单引号包围的字符时,它会将字符转换成它二进制值对应的数值。同样适用于unicode字符,它将用来存放各字节对应的二进制的数值:

var a int64 = '我'  // a=25105

由于在Go中占用3字节,所以保存到byte中是报错的:

var a byte = '我'

可以保存它的unicode字符的代码点:

var a byte = '\u0041'  // a=65,代表的字符A

float和complex

float是浮点数(俗称小数),例如0.0 3.0 -3.12 -3.120等。

Go中的浮点数类型float有两种:float32和float64。

complex表示复数类型(虚数),有complex64和complex128。

浮点数在计算机系统中非常复杂,对于学习来说,只需将其认为是数学中的一种小数即可。但以下几个注意点需要谨记心中:

  1. 浮点数是不精确的。例如1.01-0.99从数学运算的角度上得到的值是0.02,但实际上的结果是0.020000000000000018(python运算的结果),在Go中会将其表示为+2.000000e-002。这个结果是一种极限趋近于我们期待值的结果。
  2. float32的精度(7个小数位)低于float64(15个小数位),所以float64类型的值比float32类型的值更精确。
  3. 因为浮点数不精确,所以尽量不要对浮点数做==!=的比较。如果非要比较,应该转换成减法的方式和一个足够小的值来不等值比较,例如1.01-0.09 < 0.002

一般来说,在程序中需要使用浮点数的时候都使用float64类型,不仅因为精确,更因为几乎所有包中需要float参数的类型都是float64。

在Go的数学运算中,默认取的是整型数据,如果想要得到浮点数结果,必须至少让运算的一方写成浮点数格式:

var a := 3/2     // a得到截断的整数:a=1
var b := 3/2.0   // b为浮点数b=+1.500000e+000
var c := 3 + 2.0 // c为浮点数

string类型

Go中的string用于保存UTF-8字符序列,它是动态大小的。对于字母和英文字母,它占用一个字节,对于其它unicode字符,按需占用2-4个字节。例如中文字符占用3个字节。

Go中的string类型要使用双引号或反引号包围,它们的区别是:

  • 双引号是弱引用,其内可以使用反斜线转义符号,如ab\ncd表示ab后换行加cd
  • 反引号是强引用,其内任何符号都被强制解释为字面意义,包括字面的换行。也就是所谓的裸字符串。
func main() {
    println("abc\ndef")
    println(`ABC
    DEF`)
}

上面的结果将输出:

abc
def
ABC
    DEF

不能使用单引号包围,单引号包围的表示它的二进制值转换成十进制的数值。例如字母对应的是ASCII码。这个在前面byte类型中介绍过。所以,使用单引号包围的字符实际上是整数数值。例如'a'等价于97。

字符串串接

使用加号+连接两段字符串:"Hello" + "World"等价于"HelloWorld"。

可以通过+的方式将多行连接起来。例如:

str := "Beginning string "+
       "second string"

字符串连接+操作符强制认为它两边的都是string类型,所以"abcd" + 2将报错。需要先将int类型的2转换为字符串类型(不能使用string(2)的方式转换,因为这种转换方式不能跨大类型转换

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Go语言中的常量 下一篇Go基础系列:常量和变量

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目