跳到主要内容

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 也有基于架构的类型,例如 intuintuintptr。它们在 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

浮点型

类型说明
float32IEEE-754 32位浮点型数
float64IEEE-754 64位浮点型数

复数

类型说明
complex6432 位实数和虚数
complex12864 位实数和虚数

其他数字类型

以下列出了其他更多的数字类型:

类型说明
byte一个字节,是 uint8 的别名。
rune表示 Unicode 代码点的数据类型,是 int32 的别名。
uint32 或 64 位,和硬件平台的架构有关。
int与 uint 一样大小。
uintptr无符号整型,用于存放一个指针。

字符串

Go 语言中的字符串 string 以原生数据类型出现,使用字符串就像使用其它原生数据类型(intboolfloat64 等)一样。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 语言在不同类型之间赋值,需要显式类型转换。例如下面例子,你可以尝试将 float64unit 类型转换移除,看看发生什么?

type_convert.go
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

如果右边只是一个数值常量,没有具体类型,那么新变量可能是 intfloat64 以及 complex128 三种类型中的一种,取决于常量的精度。

i := 42             // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128

运行下面示例代码,你可以修改 v 的初始值,并观察它是如何影响变量类型的。

type_inference.go
package main

import "fmt"

func main() {
v := 42 // change me!
fmt.Printf("v is of type %T\n", v)
}

小结

本节只介绍了 Go 语言中内置的基本数据类型,主要包括布尔类型、数字类型和字符串类型三大类。其他类型,包括引用类型、结构类型、自定义类型等将在后续章节介绍。