-
基本数据类型
-
数值类型:
int
int8
int16
int32
int64
uint
uint8
uint16
uint32
uint64
-
字符类型:在 Go 中没有类似 Java 中的
char
类型,但是可以通过byte
来保存单个字母字符。int
系列类型也可以保存字符var ni int16 = '你' var a int8 = 'a' var b byte = 'b'
-
浮点类型:
float32
float64
-
布尔类型:
bool
-
字符串:
string
与其它语言不同的是,字符串在 Go 中被作为基本数据类型 -
结构体(struct)
-
数组
-
-
派生/复杂数据类型/引用数据类型
- 指针 (Pointer)
- 数组
- 结构体 (struct)
- 管道 (Channel)
- 函数
- 切片
- 接口
- map
整数类型
类型 | 有无符号 | 存储空间 | 数据范围 | 备注 |
---|---|---|---|---|
int8 |
有 | 1字节 | -128 ~ 127 | |
int16 |
有 | 2字节 | -2^15 ~ 2^15 - 1 | |
int32 |
有 | 4字节 | -2^31 ~ 2^31 - 1 | |
int64 |
有 | 8字节 | -2^63 ~ 2^63 - 1 | |
uint8 |
无 | 1字节 | 0 ~ 255 | |
uint16 |
无 | 2字节 | 0 ~ 2^16 - 1 | |
uint32 |
无 | 4字节 | 0 ~ 2^32 - 1 | |
unit64 |
无 | 8字节 | 0 ~ 2^64 - 1 | |
int |
有 | 计算机最大支持位数 | -2^31 ~ 2^31 - 1 -2^63 ~ 2^63 - 1 |
如果当前计算机支持64位,那么他就是64。如果计算机是32位,那么他就是32 |
uint |
无 | 计算机最大支持位数 | 0 ~ 2^32 - 1 0 ~ 2^64 - 1 |
|
rune |
有 | 4字节 | -2^31 ~ 2^31 - 1 | 与 int32 类似,表示一个 Unicode 码 |
byte |
无 | 1字节 | 0 ~ 255 | 在需要存储字符时可以使用它 |
浮点类型
浮点型也被叫做小数类型,例如:1.1、0.1...
在初始化时若不指定变量类型,float
默认声明为 float64
类型 | 存储空间 | 表数范围 |
---|---|---|
单精度 float32 |
4字节 | -3.403E38 ~ 3.403E38 |
双精度 float64 |
8字节 | -1.798E308 ~ 1.798E308 |
浮点数在机器中存放形式为:符号位 + 指数位 + 尾数位
注意:浮点数在存储过程中可能会有精度丢失问题,跟金钱相关的数值,一定要记住并解决,不应该使用浮点
字符类型
在 Go 语言中,没有专门的字符类型(类似 Java 中的 char
),如果要存储单个字符,一般使用 byte
来保存。
大多数语言字符串是一串固定长度的字符连接起来的字符序列。Go 的字符串不同,它是由字节组成的。通过单引号来表示一个字符。
var one byte = '1'
var a byte = 'a'
println(one, a)
上面的代码在执行之后,输出的值并不是我们期望的 1
和 a
,这是因为它保存的是对应的 ASCII 码
# clover @ MacBook-Pro in ~/dev/go/test-gin [22:56:15] C:1
$ go run main.go
49 97
如果我们的字符是一个汉字,那么程序会出错,因为 byte
最大范围是 0 ~ 255,汉字对应的码值远大于它。所以只要我们使用更大字节的类型就可以存储汉字字符
var you rune = '你' // int16 也可以
在某种情况下,我们可以通过
unsafe.Sizeof(xx)
方法来查看一个变量所占用的字节数大小。在保证程序正常运行下,尽量使用占用空间小的数据类型
如果需要输出中文,那么可以使用格式化输出,注意 %c
是把一个 Unicode 编码转为中文。
var you rune = '你'
fmt.Printf("%c", you)
var char = fmt.Sprintf("%c", you)
println("char =", char)
- 字符是通过单引号
''
括起来的单个字符,例如:var a byte = 'a'
- Go 中允许使用转译字符
\
来将其后的字符转译为特殊字符 - Go 语言的字符使用 UTF-8 编码,英文占用1个字节,中文2个字节
- Go 中字符的本质是一个整数,直接输出时,是该字符对应的 UTF-8 编码的值。
- 可以直接给某一个变量绑定一个数字,然后通过格式化输出
%c
,会将输出的数字转为对应的 Unicode 字符 - 字符类型是可以进行运算的,因为在 Go 中字符是被单做整数。
布尔类型
- 布尔类型也叫做
bool
类型,bool 类型数据只允许取值true
和false
- bool 类型占用 1 个字节
- boolean(bool) 类型适用于逻辑运算,一般用于程序流程控制
var boolean bool = false
字符串类型
- 在 Go 语言中,字符串被作为基本数据类型,并且默认使用 UTF-8 编码来进行处理。
- 字符串一旦赋值之后就不允许再次更改,在 Go 中,字符串是不可变的
- 字符串的两种表示形式
- 双引号会识别转译字符,例如
\n \"
- 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
以下内容会被原文输出var str string = ` package main import "fmt" func main() { var you rune = '你' fmt.Printf("%c", you) var char = fmt.Sprintf("%c", you) println("char =", char) var str string = "\n" } ` fmt.Println(str)
- 双引号会识别转译字符,例如
- 字符串允许使用符号
+
和+=
进行拼接
有一点需要注意的是,当拼接多行字符串需要换行时,符号var hello = "hello" + " world" hello += "!" fmt.Println(hello)
+
不允许换行,而是保留在当前行。var str = "hello" + " world" + "hello" + " world" // 这是不允许的 var str1 = "hello" + " world" + "hello" + " world" // 这是正确的
基本数据类型的默认值
在 Go 中,数据类型都有一个默认值,当一个类型没有赋值时就会保留默认值,在 Go 中默认值又叫零值
数据类型 | 默认值 |
---|---|
整型 | 0 |
浮点型 | 0 |
字符串 | "" |
布尔类型 | false |
基本数据类型的转换
在 Go 语言中,不同数据类型的变量之间赋值时需要显示转换,也就是说 Golang 中数据类型不能像 Java 一样可以自动转换。它的基本语法为 T(v)
,将值v转为类型 T
var age int16 = 1
var age1 int32 = int32(age)
Go 中支持小类型转大类型,也支持大类型转小类型。但是注意,大类型转小类型,可能会出现精度问题
string 和其他基本数据类型的相互转换
在我们日常开发中,经常需要将 string
数据类型转成其他数据类型,例如 int
。或者将其他基本类型转成 string
其它基本数据类型转 string
可以使用 fmt
包提供的 Sprintf
或 Sprint
方法将其他类型转为 string
var age int = 20
var ageStr = fmt.Sprint(age)
println(ageStr)
Go 也提供了相应的类型转换包 strconv
,调用它里面的一些函数就可以将指定的类型转为字符串
func FormatBool(b bool) string
func FormatComplex(c complex128, fmt byte, prec, bitSize int) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
参数 base
表示需要转成几进制的字符串,如果需要转 10 进制,base
设置为 10 就可以:
var age int64 = 20
var ageStr = strconv.FormatInt(age, 10) // 输出20
同时也可以使用 Itoa
方法对 int
进行转换,它底层默认调用 FormatInt
并且 base
为 10
string 装其它基本数据类型
可以使用 strconv
包下的这些函数将一个字符串转为指定的基本数据类型。
func ParseBool(str string) (bool, error)
func ParseComplex(s string, bitSize int) (complex128, error)
func ParseFloat(s string, bitSize int) (float64, error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)
假设将一个 string
转为 int
var age int64 = strconv.ParseInt("20", 10, 64)
这些 parse
方法需要3个参数,s
参数是指定转换的值,base
是表示这个值是几进制的。bitSize
是限制这个值是否大于指定的位数,支持 0、8、16、32、64
。如果给定的数大于 bitSize
,那么会抛出一个错误。
在将
string
类型转为其它基本类型时,需要确保string
类型是一个有效的数字字符串,否则转换失败。例如以下代码,hello
明显不是一个数字字符串。strconv.ParseInt("hello", 10, 64)
基本数据类型和引用数据类型
-
基本数据类型变量直接存储值,内存通常是分配在栈区
var num = 100
-
引用类型:变量存储的是一个地址,这个地址对应的空间才是真正存储对应的值,内存通常在堆上分配。当没有任何变量引用这个地址时,该地址对应的空间就会成为一个垃圾,等待GC进行回收。