> 數組是一組同類型數據的集合,數組初始化后長度是固定的,無法修改數組長度;
[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 快捷鍵