Go 语言数据类型
这一节我们将学习 Go 语言的基本数据类型。在 Go 程序中,数据类型主要用于声明函数和变量。
我们知道,Go 是静态强类型、编译型语言。数据类型的意义是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,这样就可以充分利用系统内存资源。
概述
Go 语言按类别有以下几种数据 类型:
类型 | 说明 |
---|---|
布尔型 | 布尔型可以表示真或假,它的值可以是 true 或者 false 。 |
数字类型 | Go 语言支持整型和浮点型数字,并且原生支持复数,其中位的运算采用补码。 |
字符串 | 字符串就是一串固定长度的字符连接起来的字符序列。 Go 的字符串是由单个字节连接起来的。 Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。 |
派生类型 | 包括: - 指针类型(Pointer) - 数组类型 - 结构体类型(struct) - 联合体类型(union) - 函数类型 - 切片类型 - 接口类型(interface) - Map 类型 - Channel 类型 |
布尔类型
布尔型 bool
的值只可以是常量 true
或者 false
。一个简单的例子:
var b bool = true
使用布尔类型时,需要注意:
- 布尔类型变量的默认值为
false
。 - Go 语言中不允许将整型强制转换为布尔型。
- 布尔型无法参与数值运算,也无法与其他类型进行转换。
数字类型
Go 也有基于架构的类型,例如 int
、uint
和 uintptr
。它们在 32 位机器上是 32 位长; 在 64 位机器上则是 64 位长。当需要使用整数时,int
类型是首选, 除非你有特别的理由一定要用 定长 或者 无符号 类型。
整型
类型 | 说明 | 范围 |
---|---|---|
uint8 | 无符号 8 位整型 | 0 到 255 |
uint16 | 无符号 16 位整型 | 0 到 65535 |
uint32 | 无符号 32 位整型 | 0 到 4294967295 |
uint64 | 无符号 64 位整型 | 0 到 18446744073709551615 |
int8 | 有符号 8 位整型 | -128 到 127 |
int16 | 有符号 16 位整型 | -32768 到 32767 |
int32 | 有符号 32 位整型 | -2147483648 到 2147483647 |
int64 | 有符号 64 位整型 | -9223372036854775808 到 9223372036854775807 |
浮点型
类型 | 说明 |
---|---|
float32 | IEEE-754 32位浮点型数 |
float64 | IEEE-754 64位浮点型数 |
复数
类型 | 说明 |
---|---|
complex64 | 32 位实数和虚数 |
complex128 | 64 位实数和虚数 |
其他数字类型
以下列出了其他更多的数字类型:
类型 | 说明 |
---|---|
byte | 一个字节,是 uint8 的别名。 |
rune | 表示 Unicode 代码点的数据类型,是 int32 的别名。 |
uint | 32 或 64 位,和硬件平台的架构有关。 |
int | 与 uint 一样大小。 |
uintptr | 无符号整型,用于存放一个指针。 |
字符串
Go 语言中的字符串 string
以原生数据类型出现,使用字符串就像使用其它原生数据类型(int
、bool
、float64
等)一样。Go 语言里的字符串的内部实现使用 UTF-8 编码。字符串的值为双引号中的内容,可以在 Go 语言的源码中直接添加非 ASCII 码字符,例如:
s1 := "hello"
s2 := "你好"
Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示:
转义符 | 含义 |
---|---|
\r | 回车符(返回行首) |
\n | 换行符(直接跳到下一行的同列位置) |
\t | 制表符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
类型转换
在 Go 语言中,使用表达式 T(v)
可以将值 v
转换成类型 T
,这就是所谓的 类型转换( type conversions )。
我们先来看一些数值类型转换:
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
或者简写成:
i := 42
f := float(i)
u := uint(f)
和 C 语言不同,Go 语言在不同类型之间赋值,需要显式类型转换。例如下面例子,你可以尝试将 float64
和 unit
类型转换移除,看看发生什么?
package main
import (
"fmt"
"math"
)
func main() {
var x, y int = 3, 4
var f float64 = math.Sqrt(float64(x*x + y*y))
var z uint = uint(f)
fmt.Println(x, y, z)
}
类型推断
变量类型通过右边的值 推断(inference)而来。如果表达式右边的值是有类型的,那么新变量也是一样的类型。例如:
var i int
j := i // j is an int as well
如果右边只是一个数值常量,没有具体类型,那么新变量可能是 int
、float64
以及 complex128
三种类型中的一种,取决于常量的精度。
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
运行下面示例代码,你可以修改 v
的初始值,并观察它是如何影响变量类型的。
package main
import "fmt"
func main() {
v := 42 // change me!
fmt.Printf("v is of type %T\n", v)
}
小结
本节只介绍了 Go 语言中内置的基本数据类型,主要包括布尔类型、数字类型和字符串类型三大类。其他类型,包括引用类型、结构类型、自定义类型等将在后续章节介绍。