Go语言的数据类型分为基础数据类型和复合数据类型。
基础数据类型:整型、浮点型、复数、布尔型、字符串
复合数据类型:数组、Slice(切片)、Map、结构体、JSON
Go语言中关于算术运算、逻辑运算和比较运算的二元运算符,它们按照优先级递减的顺序排列
* | / | % | « | » | & | &^ |
+ | - | | | ^ | | | |
== | != | < | <= | > | >= | |
&& | | | | | | |
|| | | | | | | |
二元运算符有五种优先级。在同一个优先级,使用左优先结合规则,但是使用括号可以明确优先顺序
1.整型
Go语言同时提供了有符号
(int)和无符号
(uint)类型的整数运算。
int:int8、int16、int32、int64
uint:uint8、uint16、uint32、uint64
一个n-bit的有符号数的值域是从$-2^{n-1}$
到$2^{n-1}-1$
。如int8
范围-127-127,uint
范围0-255
Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。
byte也是uint8类型的等价类型,byte类型一般用于强调数值是一个原始的数据而不是一个小的整数
var a uint8 = 255
fmt.Println(a,a+1,a*a) //"255,0,1"
var b int8 = 127
fmt.Println(b,b+1,b*b) //"127,-128,1"
一个算术运算的结果,不管是有符号或者是无符号的,如果需要更多的bit位才能正确表示的话,就说明计算结果溢出了。上面的例子就属于计算结果溢出,在声明变量是需要考虑计算结果是否会溢出,否则最后的结果可能和预期会有偏差。
2.浮点数
Go语言提供了两种精度的浮点数,float32和float64。浮点数的范围极限值可以在math
包找到。常量math.MaxFloat32表示float32能表示最大数值,大约3.4e38
;对应的math.MaxFloat64常量大约是1.8e308
。
3.复数
Go语言提供了两种精度的复数类型:complex64和complex128,分别对应float32和float64两种浮点数精度,内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部
var x complex128 = complex(1, 2) // 1+2i
var y complex128 = complex(3, 4) // 3+4i
fmt.Println(x*y) // "(-5+10i)"
fmt.Println(real(x*y)) // "-5"
fmt.Println(imag(x*y)) // "10"
4.布尔型
布尔类型的值只有两种:true和false,if和for语句的条件部分都是布尔类型的值,并且==和<等比较操作也会产生布尔值。
5.字符串
一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据,包括byte值0,但是通常是用来包含人类可读的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列
内置的len函数可以返回一个字符串中的字节数目(不是rune字符数目),索引操作s[i]返回第i个字节的字节值,i必须满足0 ≤ i< len(s)条件约束
s := "hello,world"
fmt.Println(len(s)) // 12
fmt.Println(s[0],s[7]) // "104 119" ('h' and 'w')
c := s[len(s)] //报错,访问超出字符串索引范围的字节将会导致panic异常
字符串的值是不可变的:一个字符串包含的字节序列永远不会被改变,当然我们也可以给一个字符串变量分配一个新字符串值
s := "left foot"
t := s
s += ", right foot"
fmt.Println(s) // "left foot, right foot"
fmt.Println(t) // "left foot"
//因为字符串是不可修改的,因此尝试修改字符串内部数据的操作也是被禁止的
s[0] = 'L' // compile error: cannot assign to s[0]
一个原生的字符串面值形式是...
,使用反引号代替双引号。可以用于HTML模板、JSON面值、命令行提示等。
var str string = ` a
b
`
fmt.Println(str)
// a
//b
01.unicode
Unicode码点的数据类型是int32,也就是Go语言中rune对应的类型。最大65536
02.UTF8
UTF8是一个将Unicode码点编码为字节序列的变长编码。UTF8编码使用1到4个字节来表示每个Unicode码点,ASCII部分字符只使用1个字节,常用字符部分使用2或3个字节表示.每个符号编码后第一个字节的高端bit位用于表示总共有多少编码个字节。如果第一个字节的高端bit为0,则表示对应7bit的ASCII字符,ASCII字符每个字符依然是一个字节,和传统的ASCII编码兼容。如果第一个字节的高端bit是110,则说明需要2个字节;后续的每个高端bit都以10开头。
0xxxxxxx //runes 0-127 (ASCII)
110xxxxx 10xxxxxx //128-2047 (values <128 unused)
1110xxxx 10xxxxxx 10xxxxxx //2048-65535 (values <2048 unused)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx //65536-0x10ffff (other values unused)