# 基础类型

在Go中所有变量都是有类型的, 比如前面的int, string, float32 这些, 因此在接下来我们将先讲解下Go的基础类型

静态: 变量值是有类型, 这个变量里面 只能放这个类型的值

go在语言成面定义了如下几种基础类型:

+ 整形  12345
+ 浮点型  123.45
+ 复数  123.45i
+ 字符   'a'
+ 字符串  "abc"
+ 布尔类型 true, false
+ 枚举类型 iota
+ 自定义类型 

## 字面量(值)

字面量是值的表示方法，常用与对变量/常量进行初始化，主要分为：

+ 标识基础数据类型值的字面量，例如：0, 1.1, true, 3 + 4i, 'a', "我爱中国"
+ 构造自定义的复合数据类型的类型字面量，例如：type Interval int
+ 用于表示符合数据类型值的复合字面量，用来构造 array、slice、map、struct 的值，
例如：{1, 2, 3}

## 整形(整数)

```go
var age = 99
```

|  类型名   | 字节宽度  | 取值范围 |
|  ----  | ----  | --- |
|int     |与平台有关| 32 位系统 4 字节，64 位系统 8 字节 有符号整型|
|uint | 与平台有关|32 位 系统 4 字节，64 位 系统 8 字节 无符号整形|
|int8 |1 字节| 用 8 位表示的有符号整型 取值范围为:[-128, 127]|
|int16 |2 字节| 用 16 位表示的有符号整型  取值范围为：[-32768,32767]|
|int32  | 4 字节 | 用 32 位表示的有符号整型，取值范围为：[-2147483648,2147483647] |
|int64  |8 字节  |用 64 位表示的有符号整型，取值范围为：[-9223372036854775808,9223372036854775807]|
|uint8 |1 字节 | 用 8 位表示的无符号整型，取值范围为：[0,255]|
|uint16 |2 字节 | 用 16 位表示的无符号整型，取值范围为：[0,65535]|
|uint32 |4 字节 | 用 32 位表示的无符号整型，取值范围为：[0,4294967295]|
|uint64 | 8 字节 | 用 64 位表示的无符号整型，取值范围为：[0,18446744073709551615] |
|uintptr |与平台有关|32 位系统 4 字节，64 位系统 8 字节指针值的无符号整型|


## 浮点(小数)

```go
var score = 99.5
```

|  类型名   | 字节宽度  | 取值范围 |
|  ----  | ----  | --- |
| float32| 4字节 | IEEE-754 32位浮点型数|
| float64| 8字节 | IEEE-754 64位浮点型数|
| complex64| 8字节| 由两个 float32 组成的复数（实部+虚部）|
| complex128| 16字节| 由两个 float64 组成的复数（实部+虚部）|


## 别名

```go
a := []byte{}

// %+v 打印结构体字段名
// []
fmt.Printf("%+v \n", a)

// 字符采用unicode编码, 这里的 值得这个字符串编码是 97
b := 'a'
fmt.Printf("%+v", b)
```

```go
// 用于描述字节, []byte{}, 就是字节流
// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
// used, by convention, to distinguish byte values from 8-bit unsigned
// integer values.
type byte = uint8

// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32
```

|  类型名   | 字节宽度  | 取值范围 |
|  ----  | ----  | --- |
|byte |1 字节| 字节类型，取值范围同 uint8|
|rune |4 字节| Unicode 码点 取值范围同 uint32|

## 字符串类型

```go
name := "bob"
```

Go 语言内置了字符串类型，使用 string 表示

字面量：

+ 可解析字符串：通过双引号(")来创建，不能包含多行，支持特殊字符转义序列
+ 原生字符串：通过反引号(`)来创建，可包含多行，不支持特殊字符转义序列

特殊字符：

+ \\：反斜线
+ \'：单引号
+ \"：双引号
+ \a：响铃
+ \b：退格
+ \f：换页
+ \n：换行
+ \r：回车
+ \t：制表符
+ \v：垂直制表符
+ \ooo：3 个 8 位数字给定的八进制码点的 Unicode 字符（不能超过\377）
+ \uhhhh：4 个 16 位数字给定的十六进制码点的 Unicode 字符
+ \Uhhhhhhhh：8 个 32 位数字给定的十六进制码点的 Unicode 字符
+ \xhh：2 个 8 位数字给定的十六进制码点的 Unicode 字符

## 布尔类型

布尔类型用于表示真假，类型名为 bool，只有两个值 true 和 false，占用一个字节宽度，零值为 false
```go
var (
    IsBoy  = true
    IsGirl = true
)

// if IsBoy {}
```

## 自定义类型与枚举类型

在 go 语言中使用 type 声明一种新的类型，语法格式为： type TypeName Formatter

比如我们可以定义自己
```go
type Gender string
```

常使用 iota 生成器用于初始化一系列相同规则的常量，批量声明常量的第一个常量使用
iota 进行赋值，此时 iota 被重置为 0，其他常量省略类型和赋值，在每初始化一个常量则
加 1

```go
// 自定义类型
type Status string

const (
	// 自定义类型的值，常量不允许修改, 充当枚举(可选项)
	STATUS_ONLINE  Status = "online"
	STATUS_OFFLINE Status = "offline"
	STATUS_UNKNOW  Status = "unknow"
)
```

## 零值

所有的基础类型，没有被赋值都有一个 零值:
整数:0
小数:0
bool: false
