> 数组是一组同类型数据的集合,数组初始化后长度是固定的,无法修改数组长度;
[TOC]
## 数组
### 数组定义
> 语法: `var 变量名 [数组大小]元素类型`
~~~
// 定义拥有10个元素的数组a,元素类型是int
var a [3]int
// 定义拥有2个元素的字符串数组
var arr [2]string
~~~
### 数组变量默认值
> 数组定义后会默认初始化,根据数组元素类型进行复制,比如int为0,string为空字符
~~~
// 默认初始化为 [0, 0, 0]
var arr1 [3]int
// 默认初始化为 ["", ""]
var arr2 [2]string
fmt.Println(arr1, arr2)
~~~
### 数组初始化
> 可以在定义数组的时候直接初始化数组元素
~~~
// 数组大小为6, 后面花括号直接初始化6个元素
primes := [6]int{2, 3, 5, 7, 11, 13}
~~~
### 读写数组元素
> 通过下标引用数组元素,下标从0开始计算,最大不能超过数组长度
~~~
// 定义字符串数组a,数组大小等于2
var a [2]string
// 给数组第一个元素赋值
a[0] = "Hello"
// 给数组第二个元素赋值
a[1] = "World"
// 打印数组第1和2个元素
fmt.Println(a[0], a[1])
~~~
### 获取数组大小
> 可以通过len获取数组大小
~~~
primes := [6]int{2, 3, 5, 7, 11, 13}
// 打印数组大小
fmt.Println(len(primes))
~~~
## 切片
### 切片定义
> 语法1: `var 变量名 []元素类型`
> 语法2: `变量名 := make([]type, len)`
> 语法2: `变量名 := make([]type, len, capacity)`,len (长度)、capacity(容量)
> 切片如果没有初始化,默认值是nil
~~~
var slice1 []int
slice2 := make([]int, 3)
slice3 := make([]int, 0, 5) // 创建int类型切片,包含0个元素,切片容量为5
if(slice1 == nil){
fmt.Printf("切片是空的")
}
fmt.Println(slice1, slice2, slice3)
~~~
### 切片变量默认值
> 没有初始化的切片变量,默认值是nil
~~~
var slice1 []int
if slice1 == nil {
fmt.Println("is nil")
}
fmt.Println(slice1)
~~~
### 切片初始化
~~~
slice1 := []int {1, 2, 3}
arr := [3]string {"111", "222", "333"}
slice2 := arr[0:2]
~~~
### 切片截取
> 可以通过设置下限及上限来设置截取切片 [startIndex:endIndex]
~~~
arr := [3]string {"111", "222", "333"}
//arr := []string {"111", "222", "333"}
// 从arr【可为数组/或切片】 [切割 startIndex <= 下标范围 < endIndex] 初始化切片slice1
slice1 := arr[startIndex:endIndex]
// 从arr【可为数组/或切片】 [切割 startIndex <= 下标范围 < len(arr)] 初始化切片slice1
slice1 := arr[startIndex:]
// 从arr【可为数组/或切片】 [切割 0 <= 下标范围 < endIndex] 初始化切片slice1
slice1 := arr[:endIndex]
// 忽略开始和结束位置,代表切割所有数据,相当于引用整个数组或切片
slice1 := arr[:]
~~~
### 切片的大小和容量
> 使用 len() 和 cap() 函数
~~~
slice1 := []int{2, 3, 5, 7, 11, 13}
fmt.Println(len(slice1), cap(slice1))
~~~
### 向切片添加元素
~~~
package main
import "fmt"
func main() {
var slice1 []int
// 将1增加到切片尾部
slice1 = append(slice1, 1)
// append函数支持一次性添加多个元素
slice1 = append(slice1, 2, 3, 4)
fmt.Printf("len=%d cap=%d %v\n", len(slice1), cap(slice1), slice1)
}
~~~
### 读写切片元素
> 需要注意的是,因为切片底层引用的是数组,如果多个切片引用同一个数组,修改其中一个切片的元素,会影响关联的所有切片。
~~~
package main
import "fmt"
func main() {
names := [4]string{"John", "Paul", "George", "Ringo"}
fmt.Println(names)
// 创建a,b两个切片
a := names[0:2]
b := names[1:3]
fmt.Println(a, b)
// 修改切片b的第一个元素
b[0] = "XXX"
fmt.Println(a, b)
fmt.Println(names)
}
~~~
> 输出
~~~
[John Paul George Ringo]
[John Paul] [Paul George]
[John XXX] [XXX George]
[John XXX George Ringo]
~~~
## 遍历数组或切片
> 通过range关键词结合for语句遍历切片
~~~
package main
import "fmt"
// 定义切片或数组
items := []string{"aaa", "bbb", "ccc"}
//items := [3]string{"aaa", "bbb", "ccc"}
func main() {
// index 为切片下标,value 为对应的元素值
for index, value := range items {
fmt.Printf("%d = %s\n", index, value)
}
}
~~~
- 基础知识
- 开发环境
- 包名规则
- 包初始化 (init)
- 基础数据类型
- 基础类型转换
- 格式化输出
- go指针
- 流程控制语句
- 函数定义
- 匿名函数
- 数组和切片
- map集合
- 结构体
- Interface接口
- 日期处理
- 数学计算
- 正则表达式
- 协程 (并发处理)
- channel
- waitgroup
- mutex (锁机制)
- websocket
- protobuf
- Redis
- 错误处理
- 打包程序
- NSQ消息队列
- 单元测试
- beego
- 安装入门
- Gin
- 快速入门
- 路由与控制器
- 处理请求参数
- 表单验证
- 处理响应结果
- 渲染HTML模版
- 访问静态文件
- Gin中间件
- Cookie处理
- Session处理
- Gin上传文件
- swagger
- pprof性能测试
- GORM
- 入门教程
- 模型定义
- 数据库连接
- 插入数据
- 查询数据
- 更新数据
- 删除数据
- 事务处理
- 关联查询
- 属于 (BELONG TO)
- 一对一 (Has One)
- 一对多 (Has Many)
- 多对多 (Many to Many)
- 预加载 (Preloading)
- 错误处理
- 第三方常用插件
- viper 读取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷键