目录
整形
基本整型
特殊整型
浮点型
布尔型
字符型
字符串转义符
多行字符串
字符串的常用操作
复数
我们不论在学习什么语言中,我们都要去认识一下这个语言中的数据类型,当然学习Go也不例外,我们也要去认识一下其相关的数据类型,当然这些数据类型基本上是大同小异的,如果学之前一些语言的学习经验的话,在理解学习起来将会更加的迅速。
在Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有数组、切片、结构体、函数、map、通道(channel)等。
新手须知: 整型数据指的是不包含小数部分的数值型数据。整型数据只用来表示整数,以二进制形式存储。
Go语言中的整型分为有符号和无符号两类:
uint8
就是我们熟知的byte
型,int16
对应C语言中的short
型,int64
对应C语言中的long
型。
特殊整型在这里指的是两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint;其中int是应用最广泛的数值类型。这两种类型都有同样的大小,32或64bit,但是我们不能对此做任何的假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小;以及说是还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。uintptr类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方
注意事项:获取对象的长度的内建
len()
函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int
来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int
和uint
。
package main
import (
"fmt"
)
func main() {
var a int
var b int32
var c uint = 10
a = 2147483647
b = -2147483648
fmt.Print(a, b, c)
}
Go语言支持两种精度的浮点数,float32和float64。它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持。
这两种浮点型数据格式遵循IEEE 754
标准: float32
的浮点数的最大范围约为 3.4e38
,可以使用常量定义:math.MaxFloat32
。 float64
的浮点数的最大范围约为 1.8e308
,可以使用一个常量定义:math.MaxFloat64
。 (需要注意的是:因为float32的有效bit位只有23个,其它的bit位用于指数和符号;当整数大于23bit能表达的范围时,float32的表示将出现误差)
打印浮点数的方式:这里我们使用fmt
包配合动词%f
package main
import (
"fmt"
"math"
)
func main() {
var a float64
a = 5.923871
fmt.Print(a)
fmt.Printf("\n%f\n", math.Pi)
fmt.Printf("%.5f\n", math.Pi)
}
新手须知:一个布尔类型的值只有两种:true和false。if和for语句的条件部分都是布尔类型的值,并且==和<等比较操作也会产生布尔型的值。一元操作符
!
对应逻辑非操作,因此!true
的值为false
,更罗嗦的说法是(!true==false)==true
,虽然表达方式不一样,不过我们一般会采用简洁的布尔表达式,就像用x来表示x==true
。
Go语言中以bool
类型进行声明布尔型数据,布尔型数据只有true(真)
和false(假)
两个值。
布尔值可以和&&(AND)和||(OR)操作符结合,并且有短路行为:如果运算符左边值已经可以确定整个布尔表达式的值,那么运算符右边的值将不再被求值,因此下面的表达式总是安全的:
s != "" && s[0] == 'x'
注:
&&
的优先级比||
高)
布尔值并不会隐式转换为数字值0或1,反之亦然。必须使用一个显式的if语句辅助转换:
i := 0
if b {
i = 1
}
注意:
- 布尔类型变量的默认值为
false
。- Go 语言中不允许将整型强制转换为布尔型.
- 布尔型无法参与数值运算,也无法与其他类型进行转换。
新手须知:字符串是一个不可改变的字节序列。字符串可以包含任意的数据,包括byte值0,但是通常是用来包含人类可读的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列
Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8
编码。 字符串的值为双引号(")
中的内容,可以在Go语言的源码中直接添加非ASCII码字符。
字符串值也可以用字符串面值方式编写,只要将一系列字节序列包含在双引号内即可:
s1 := "Hello"
s2 := "World"
Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。
Go语言中要定义一个多行字符串时,就必须使用反引号
字符:
s := `第一行
第二行
第三行
...
第n行
`
fmt.Println(s)
反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
Go语言提供了两种精度的复数类型:complex64和complex128,分别对应float32和float64两种浮点数精度。
内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部:
var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
var x complex128 = complex(1, 2) // 1+2i
var y complex128 = complex(3, 4) // 3+4i
fmt.Println(x*y)
fmt.Println(real(x*y))
fmt.Println(imag(x*y))
fmt.Println(c1)
fmt.Println(c2)
注:
- 复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。
- 复数也可以用==和!=进行相等比较。只有两个复数的实部和虚部都相等的时候它们才是相等的,所以需要小心的处理其精度的问题