<p align="right">2021年08月31日 13:54:49</p>
[TOC]
| 类型 | 长度(字节) | 默认值 | 说明 |
| --- | --- | --- | --- |
| bool | 1 | false | |
| byte | 1 | 0 | uint8 |
| rune | 4 | 0 | Unicode Code Point, int32 |
| int, uint | 4或8 | 0 | 32 或 64 位 |
| int8, uint8 | 1 | 0 | \-128 ~ 127, 0 ~ 255,byte是uint8 的别名 |
| int16, uint16 | 2 | 0 | \-32768 ~ 32767, 0 ~ 65535 |
| int32, uint32 | 4 | 0 | \-21亿~ 21亿, 0 ~ 42亿,rune是int32 的别名 |
| int64, uint64 | 8 | 0 | |
| float32 | 4 | 0.0 | |
| float64 | 8 | 0.0 | |
| complex64 | 8 | | |
| complex128 | 16 | | |
| uintptr | 4或8 | | 以存储指针的 uint32 或 uint64 整数 |
| array | | | 值类型 |
| struct | | | 值类型 |
| string | | "" | UTF-8 字符串 |
| slice | | nil | 引用类型 |
| map | | nil | 引用类型 |
| channel | | nil | 引用类型 |
| interface | | nil | 接口 |
| function | | nil | 函数 |
> 详见标准库math,定义了各数字类型的取值范围,例如`math.MinInt16`
## 整型
按长度分:`int8`、`int16`、`int32`、`inint64`
对应无符号整型:`uint8`、`uint16`、`uint32`、`uinnt64`
## 浮点型
两种浮点型:`float32`、`float64`
遵循`IEEE 754`标准:`float32`的最大范围为`3.4e38`,常量`math.MaxFloat32`
`float64`的最大范围为`1.8e308`,常量`math.MaxFloat64`
## 布尔值
`bool`类型声明布尔型数据,布尔型只有true和false两个值
> Go语言不允许将整型转换为布尔型
> 布尔型也无法参与数值运算,也无法与其他类型进行转换
## 字符串
Go语言里的字符串的内部实现使用utf-8编码,可以直接在Go语言的源码中添加ASCII码字符,例如
```
s1 := "hello"
s2 := "你好"
```
### byte和rune类型
组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(’)包裹起来,如:
```
var a := '中'
var b := 'x'
```
Go语言中的字符有以下两种
- byte类型: 代表了ASCII码中的一个字符,实际类型uint8
- runne类型: 代表了一个UTF-8字符,实际类型uint32,例如处理中文、日文或则其他复合字符
```
// 遍历字符串
func traversalString() {
s := "pprof.cn博客"
for i := 0; i < len(s); i++ { //byte
fmt.Printf("%v(%c) ", s[i], s[i])
}
fmt.Println()
for _, r := range s { //rune
fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()
}
```
输出结果
```
112(p) 112(p) 114(r) 111(o) 102(f) 46(.) 99(c) 110(n) 229(å) 141() 154() 229(å) 174(®) 162(¢)
112(p) 112(p) 114(r) 111(o) 102(f) 46(.) 99(c) 110(n) 21338(博) 23458(客)
```
> 解释:因为UTF8编码下一个中文汉字由`3~4`个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。
### 字符串转义
| 转义 | 含义 |
| --- | --- |
| \\r | 回车符(返回行首) |
| \\n | 换行符(直接跳到下一行的同列位置) |
| \\t | 制表符 |
| \\' | 单引号 |
| \\" | 双引号 |
| \\ | 反斜杠 |
### 多行字符串
Go语言中要定义一个多行字符串时,就必须使用`反引号`字符:
```
s1 := `第一行
第二行
第三行
`
fmt.Println(s1)
```
> 反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
### 字符串的常见操作
| 方法 | 介绍 |
| --- | --- |
| len(str) | 求长度 |
| +或fmt.Sprintf | 拼接字符串 |
| strings.Split | 分割 |
| strings.Contains | 判断是否包含 |
| strings.HasPrefix,strings.HasSuffix | 前缀/后缀判断 |
| strings.Index(),strings.LastIndex() | 子串出现的位置 |
| strings.Join(a\[\]string, sep string) | join操作 |
### 修改字符串
要修改字符串,需要先将其转换成`[]rune或[]byte`,完成后再转换为`string`。无论哪种转换,都会重新分配内存,并复制字节数组。
```
func changeString() {
s1 := "hello"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'H'
fmt.Println(string(byteS1))
s2 := "博客"
runeS2 := []rune(s2)
runeS2[0] = '狗'
fmt.Println(string(runeS2))
}
```
> tips: 字符串底层是一个byte数组,所以可以和\[\]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
## 类型转换
Go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。
强制类型转换的基础语法如下:其中,T表示要转换的类型。表达式包括变量、复杂算子和函数返回值等.
```
T(表达式)
```
例如:计算直角三角形的斜边长时使用math包的Sqrt()函数,该函数接收的是float64类型的参数,而变量a和b都是int类型的,这个时候就需要将a和b强制类型转换为float64类型。
```
func sqrtDemo() {
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是float64类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
}
```