3-基本数据类型
3 基本数据类型
基本数据类型包括:整型、浮点型、布尔型、字符串。
除以上基本类型之外,还有 数组、切片、结构体、函数、map、通道 等。
3.1 整型
3.1.1 整型
整型分为:int8、int16、int32、int64 ,以及对应的无符号整型:uint8、uint16、uint32、uint64
其中 unit8 对应其他语言中的 byte 类型;int16 对应 C 语言中的 short 类型;int64 对应 C 语言中的 long 类型。
各数据类型及对应的取值关系如下:

特殊整型:

注意: 获取对象的长度时,内建的
len()函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以直接使用 int 来表示 。
3.1.2 八进制和十六进制
1 | package main |
3.2 浮点型
go 语言支持两种浮点型数,float32 和 float64.
这两种浮点型数据格式遵循 IEEE 754 标准, float32 的浮点数的最大范围约为 3.4e38 ,可以使用常量定义:math.MaxFloat32。float64 的浮点数的最大范围约为 1.8e308, 可以使用常量定义 math.MaxFloat64
1 | package main |
3.3 复数
- 复数实际上是有两个实数(浮点数)的组合,一个表示实部(real),一个表示虚部(imag)。
- 虚部需要添加
i作为后缀。 real(复数)可以获取实部 ,imag(复数)可以获取虚部- 有
complex64和complex128两种类型,complex64 的实部和虚部为 32 位,complex128 的实部和虚部为 64 位。
1 | package main |
运行结果:
1 | cnpeng$ go run Day1.go |
3.4 布尔类型
3.4.1 布尔类型
go 语言中以 bool 声明布尔类型数据。布尔类型仅有 true 和 false 两种值。
注意:
- 布尔类型变量的默认值为 false
- go 语言中不允许将整型强制转换为布尔类型
- 布尔型数据无法参与数值运算,与无法与其他类型进行转换。
3.4.2 补充:格式化输出的总结
fmt 包的 Printf() 格式化输出可以使用下面的格式化符号:
| 格式 | 含义 |
|---|---|
%% |
% 字面量 |
%b |
二进制整数值(基数为2),或者是(高级的)用科学计数法表示的指数为2的浮点数 |
%c |
字符型。可以把输入的数字按照 ASCII 码转换为对应的字符。 |
%d |
十进制数值(基数为10) |
%e |
以科学计数法 e 表示的浮点数或者复数值 |
%E |
以科学计数法 E 表示的浮点数或者复数值 |
%f |
以标准计数法表示的浮点数或者复数值 |
%g |
以%e或者%f表示的浮点数或者复数,任何一个都以最为紧凑的方式输出 |
%G |
以 %E或者%f表示的浮点数或者复数,任何一个都以最为紧凑的方式输出 |
%o |
以八进制表示的数字 |
%p |
以十六进制表示的值的地址,前缀为 0x, 字母使用小小的 a-f 表示 |
%s |
字符串 |
%t |
以 true 或者 false 输出布尔值 |
%T |
获取数据类型。 |
%U |
用 Unicode 表示法表示的整型码点。默认值为四个数字字符 |
%v |
使用默认格式输出的内置或自定义类型的值。或者时使用期望类型的 String() 方式输出的自定义值。 |
%#v |
如果输出的字符串,该字符串会被双引号包裹起来 |
%x |
以十六进制表示的整型值, a-f 使用小写 |
%X |
以十六进制表示的整型值, A-F 使用大写 |
1 | package main |
3.4 字符串
go 语言中的字符串以原生数据类型出现,使用字符串就想使用其他原生数据类型(int、bool、float32、float64 等)一样。
go 语言中字符串的内部实现使用了 UTF-8 编码。字符串的值使用双引号 " " 包裹( go 语言中,只有使用单引号 ' ' 包裹的是字符)。
3.4.1 字符串转义符
| 转义符 | 含义 |
|---|---|
\r |
回车符(返回行首) |
\n |
换行符 |
\t |
制表符 |
\' |
单引号 |
\" |
双引号 |
\\ |
反斜杠 |
1字节=8Bit ,即1字节表示八个二进制位,也就是 八个 01——01010101
一个 UTF-8 编码的汉字通常占用三个字节,偏僻字可能会占四个字节。
1 | package main |
3.4.2 多行字符串(原样字符串)
go 语言中要定义一个多行字符串时,使用 反引号 (即键盘左上角数字一左侧的那个按键) 包裹。也叫原样字符串,输入啥样,输出就啥样。
1 | package main |

1 | package main |
3.4.3 字符串的常用操作
| 方法 | 含义 |
|---|---|
len(str) |
获取字符串的长度 |
+ 或 fmt.Sprintf() |
拼接字符串 |
strings.Split |
分割 |
strings.contains |
判断是否包含 |
strings.HasPrefix、strings.HasSuffix |
前缀、后缀的判断 |
strings.Index()、strings.LastIndex() |
子串出现的位置 |
strings.Join(a[]string,sep string) |
join 操作 (拼接) |
字符串是由 byte 字节组成,所以字符串的长度就是 byte 字节的长度。
1 | package main |
3.4.4 byte 和 rune 类型
组成每个字符串的元素叫做字符。可以通过遍历或者单个获取字符串元素获得字符。字符使用单引号包裹,如:
1 | var a := '中' |
go 语言中的字符有如下两种:
uint8类型,或者叫byte类型,代表了 ASCII 码的一个字符。rune类型,代表一个UTF-8字符。一个rune字符由一个或多个 byte 组成。
当需要处理中文、日文或其他复合字符时,需要使用 rune 类型。rune 类型实际是一个 int32
1 | package main |
因为 UTF-8 编码下一个中文汉字由 3-4 个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面第一个遍历中的结果。
3.4.5 修改字符串
字符串是不能直接修改的。
字符串底层是一个 byte 数组,所以可以和 []byte 类型相互转换。
修改字符串时,需要先将其转换成 []rune 或 []byte, 修改完成后再转换为 string。无论哪种转换都会重新分配内存,并复制字节数组。
1 | package main |
3.5 类型转换和类型别名
3.5.1 类型转换
Go 语言中不允许隐式转换,所有类型转换必须显示声明,而且转换只能发生在两种相互兼容的类型之间。
1 | package main |
3.5.2 类型别名
- 为现有的类型定义别名,方便调用。关键字
type
( 在 Swift 中也有这种类型别名,特别是对函数类型定义别名很有用)
1 | package main |
运行结果:
1 | cnpeng$ go run Day1.go |
3.6 strconv 包
Go 语言中 strconv 包实现了基本数据类型和其字符串表示的相互转换。主要有以下常用函数: Atoi()、Itoa()、parse 系列、format 系列、append 系列。
3.6.1 string与int类型转换
这一组函数是我们平时编程中用的最多的。
3.6.1.1 Atoi()
Atoi() 函数用于将字符串类型的整数转换为int类型,函数签名如下。
1 | func Atoi(s string) (i int, err error) |
如果传入的字符串参数无法转换为int类型,就会返回错误。
1 | s1 := "100" |
3.6.1.2 Itoa()
Itoa() 函数用于将 int 类型数据转换为对应的字符串表示,具体的函数签名如下。
1 | func Itoa(i int) string |
示例代码如下:
1 | i2 := 200 |
3.6.1.3 a的典故
这是 C 语言遗留下的典故。C 语言中没有 string 类型而是用字符数组(array)表示字符串,所以 Itoa 对很多 C 系的程序员很好理解。
3.6.2 Parse系列函数
Parse 类函数用于转换字符串为给定类型的值:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。
3.6.2.1 ParseBool()
1 | func ParseBool(str string) (value bool, err error) |
返回字符串表示的 bool 值。
- 当 str 为:1,t,T,TRUE,true,True 中的一种时为真值
- 当 str 为:0,f,F,FALSE,false,False 中的一种时为假值
- 其他输入内容一律返回 false
1 | fmt.Println(strconv.ParseBool("t")) |
3.6.2.2 ParseInt()
1 | func ParseInt(s string, base int, bitSize int) (i int64, err error) |
返回字符串表示的整数值,接受正负号。
base指定进制(2到36),如果 base 为0,则会从字符串前置判断;0x是16进制,0是 8 进制,否则是 10 进制;bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64;返回的 err 是
*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange。
3.6.2.3 ParseUnit()
1 | func ParseUint(s string, base int, bitSize int) (n uint64, err error) |
ParseUint 类似 ParseInt 但不接受正负号,用于无符号整型。
3.6.2.4 ParseFloat()
1 | func ParseFloat(s string, bitSize int) (f float64, err error) |
解析一个表示浮点数的字符串并返回其值。
如果 s 合乎语法规则,函数会返回最为接近 s 表示值的一个浮点数(使用 IEEE754 规范舍入)。
bitSize指定了期望的接收类型,32 是 float32(返回值可以不改变精确值的赋值给float32),64 是 float64;- 返回值 err 是
*NumErr类型的,语法有误的,err.Error=ErrSyntax;结果超出表示范围的,返回值 f 为±Inf,err.Error= ErrRange。
3.6.2.5 代码示例
1 | b, err := strconv.ParseBool("true") |
这些函数都有两个返回值,第一个返回值是转换后的值,第二个返回值为转化失败的错误信息。
3.6.3 Format系列函数
Format 系列函数实现了将给定类型数据格式化为 string 类型数据的功能。
3.6.3.1 FormatBool()
1 | func FormatBool(b bool) string |
根据 b 的值返回 "true" 或 "false"。
3.6.3.2 FormatInt()
1 | func FormatInt(i int64, base int) string |
返回 i 的 base 进制的字符串表示。base 必须在2到36之间,当 base 大于 10 时,结果中会使用小写字母 a 到 z 表示大于 10 的数字。
3.6.3.3 FormatUint()
1 | func FormatUint(i uint64, base int) string |
是 FormatInt 的无符号整数版本。
3.6.3.4 FormatFloat()
1 | func FormatFloat(f float64, fmt byte, prec, bitSize int) string |
函数将浮点数表示为字符串并返回。
bitSize表示 f 的来源类型(32:float32、64:float64),会据此进行舍入。fmt表示格式:f(-ddd.dddd)、b(-ddddp±ddd,指数为二进制)、e(-d.dddde±dd,十进制指数)、E(-d.ddddE±dd,十进制指数)、g(指数很大时用e格式,否则f格式)、G(指数很大时用E格式,否则f格式)。prec控制精度(排除指数部分):对f、e、E,它表示小数点后的数字个数;对g、G,它控制总的数字个数。如果 prec 为 -1,则代表使用最少数量的、但又必需的数字来表示 f 。
3.6.3.5 代码示例
1 | s1 := strconv.FormatBool(true) |
3.6.4 其他
3.6.4.1 isPrint()
1 | func IsPrint(r rune) bool |
返回一个字符是否是可打印的,和 unicode.IsPrint 一样,r 必须是:字母(广义)、数字、标点、符号、ASCII空格。
3.6.4.2 CanBackquote()
1 | func CanBackquote(s string) bool |
返回字符串 s 是否可以不被修改的表示为一个单行的、没有空格 和 tab之外控制字符的反引号字符串。
3.6.4.3 其他
除上文列出的函数外,strconv 包中还有 Append系列、Quote系列等函数。具体用法可查看官方文档。




