> ### 例子一
* 當切片長度小于1024時, 擴容為原來的2倍, 大于或等于1024時, 擴容1.25倍
* slice\[start:end:cap\]
~~~
package main
import "fmt"
// make([]T, length長度, capacity容量)
// 一般使用make()創建 : 用len獲取切片長度, cap獲取切片容量
// 一個切片在未初始化之前默認為 nil,長度為 0
// 切片是基于數組類型做的一層封裝,自動擴容
// 與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大
func main() {
var number1 []string
number2 := []string{"A", "B", "C"}
number3 := make([]int, 2, 2)
number4 := append(number3, []int{3, 4, 5}...) //number4 := append(number3,number3...)//用省略號自動展開切片,以使用每個元素
//長度和容量 切片再切片
//cap 省略時 默認等于 len
//number5... 展開number5切片成一個個元素
// var a[5]int = [5]int{5, 4, 3, 2, 1} //sort.Ints(a[:])
fmt.Println("Number1:", number1)
fmt.Println("Number2:", number2)
fmt.Printf("Number3: %d, len:%d, cap:%d\n", number3, len(number3), cap(number3))
fmt.Printf("Number4: %d, len:%d, cap:%d\n", number4, len(number4), cap(number4))
number5 := []string{"A", "B", "C"}
number6 := []string{"D", "E"}
number7 := copy(number6, number5) //等位替換原切片(返回替換成功的個數)
fmt.Printf("Number6: copy success number %d --- %s\n", number7, number6)
}
~~~
> ### 例子二
~~~
package main
import "fmt"
func main() {
//[start:end] [start:] [:end] [:] -- 第三個參數: 遞增
number8 := []int{9, 12, 35, 41, 95, 60, 17, 66, 9, 10}
fmt.Println("Number8-1:", number8[3:6])
//切片是引用類型(對數組的引用)
fmt.Printf("Number8-2: %d, Addr:%p, Len:%d, Cap:%d \r\n", number8, number8, len(number8), cap(number8))
number9 := number8
number9[3] = 77
fmt.Printf("Number8-3: %d, Addr:%p, Len:%d, Cap:%d", number8, number8, len(number8), cap(number8))
fmt.Println("")
number8 = append(number8, 11)
number9[3] = 88
fmt.Printf("Number8-4: %d, Addr:%p Len:%d, Cap:%d", number8, number8, len(number8), cap(number8))
}
~~~
> ### 例子三
~~~
package main
import "fmt"
func main() {
number1 := make([]int, 1, 2)
fmt.Printf("%p\n", number1) //圖1
fmt.Printf("%p\n", &number1[0]) //圖2
fmt.Printf("%p\n", &number1) //圖3 切片變量的地址(ptr len cap)
}
~~~

> ### 例子四
~~~
package main
import "fmt"
func main() {
//->■■■■■□□□□□
number1 := make([]int, 5, 10)
//fmt.Println(number1[5]) //超出下標索引
//■■ ->■■■■■□□□
number2 := number1[2:7]
fmt.Println(number2, cap(number2))
}
~~~
> ### 例子五
~~~
package main
import "fmt"
func main() {
//->■■■■■□□□□□
number1 := make([]int, 5, 10)
//■■ ->■■■■■□□□
number2 := number1[2:7]
number1[3] = 3
fmt.Println(number1)
fmt.Println(number2)
number2[3] = 4
fmt.Println(number1)
fmt.Println(number2)
}
~~~
> ### 例子6(去掉TODO2再看下打印結果)--(對一個變量追加元素,扔到新變量上,那么舊的變量就沒用了)
~~~
package main
import "fmt"
func main() {
x := []int{1}
fmt.Println("-----TODO1-----")
fmt.Printf("%v, %d, %d\n", x, len(x), cap(x))
fmt.Println("-----TODO2-----")
x = append(x, 3)
fmt.Printf("%v, %d, %d\n", x, len(x), cap(x))
fmt.Println("-----TODO3-----")
x = append(x, 5)
fmt.Printf("%v, %d, %d\n", x, len(x), cap(x))
fmt.Println("-----TODO4-----")
y := append(x, 7)
fmt.Printf("%v, %d, %d\n", x, len(x), cap(x))
fmt.Printf("%v, %d, %d\n", y, len(y), cap(y))
fmt.Println("-----TODO5-----")
z := append(x, 9)
fmt.Printf("%v, %d, %d\n", x, len(x), cap(x))
fmt.Printf("%v, %d, %d\n", z, len(z), cap(z))
fmt.Println("-----TODO6-----")
fmt.Println(x, y, z)
}
~~~
> ### copy
~~~
package main
import "fmt"
func main() {
//`copy` 函數`copy`從源`slice`的`src`中復制元素到目標`dst`,并且返回復制的元素的個數
number1 := []int{1, 2, 3, 4, 5}
number2 := []int{6, 7, 8}
number3 := copy(number1, number2)
fmt.Println(number1, number2, number3)
number4 := []int{1, 2, 3, 4, 5}
number5 := []int{6, 7, 8}
number6 := copy(number5, number4)
fmt.Println(number4, number5, number6)
}
~~~
> ### append
~~~
package main
import "fmt"
func main() {
//`append` 向`slice`里面追加一個或者多個元素,然后返回一個和`slice`一樣類型的`slice`
number1 := []int{1, 2, 3}
fmt.Println(number1, len(number1), cap(number1))
number1 = append(number1, 4, 5)
fmt.Println(number1, len(number1), cap(number1)) //按初始容量成倍擴大
number3 := append(number1, number1...) //用省略號自動展開切片,以使用每個元素
fmt.Println(number3)
}
~~~
- 第一序 入門教程(一)
- 1.1環境配置
- 1.1 環境配置(補充:Linux下安裝)
- 1.1 環境配置(補充:線上部署)
- 1.2 開發工具GoLand
- 1.3 準備工作
- 1.4 第一個應用程序 Hello World
- 1.4 補充 go get github 超時
- 第二序 入門教程(二)
- 2.1 語法結構
- 2.2 常量, 變量
- 2.2.1 命名規則
- 2.2.2 變量
- 2.2.2 變量(補充:類型推斷的好處)
- 2.2.2 變量(補充:泛型)
- 2.2.3 常量
- 2.2.4 iota
- 2.2.5 Unicode字符編碼
- 2.2.6 GBK 轉 UTF8
- 2.3 條件語句
- 2.3.1 判斷語句 if
- 2.3.2 選擇語句 switch
- 2.3.3 循環語句 for
- 2.3.4 遍歷 range
- 2.3.5 跳轉語句 goto, break, continue
- 2.3.6 for 和 for range區別
- 2.4 數組, 切片, 集合, 通道
- 2.4.1 make, len, cap, new, nil
- 2.4.1 make, len, cap, new, nil (補充:nil)
- 2.4.2 數組 array
- 2.4.3.1 切片 slice - 1
- 2.4.3.2 切片 slice - 2
- 2.4.3.3 slice list ring
- 2.4.4 集合 map
- 2.4.5 goroutine
- 2.4.6 channel
- 2.5 函數, 結構, 方法, 接口
- 2.5.1 函數 function
- 2.5.2 結構 struct
- 2.5.3 方法 method
- 2.5.4 接口 interface
- 2.5.5 Go是面向對象的語言嗎?
- 2.5.6 json序列化和反序列化
- 2.5.7 T和指針T
- 2.6 defer, panic, recover
- 2.6.1 defer
- 2.6.2 painc, recover
- 2.7 指針
- 2.7 指針(補充: 可尋址和不可尋址)
- 2.8 反射
- 第三序 相關閱讀
- 3.1 相關閱讀1
- 3.2 相關閱讀2
- 3.3 相關閱讀3
- 第四序 性能分析和調試工具
- 4.1 pprof工具介紹
- 4.2 CPU信息采集
- 4.3 Heap信息采集
- 4.4 Http信息采集
- 4.5 單元測試(功能測試)
- 4.6 基準測試(壓力測試/性能測試)
- 4.7 示例測試(example)
- 4.8 gdb調試
- 第五序 網絡編程
- 5.1 http請求和響應
- 5.2 socket
- 5.2.1 概念
- 5.2.2 服務端
- 5.2.3 客戶端
- 5.3 WebSocket
- 5.3.1 第一版
- 5.3.1.1 服務端
- 5.3.1.2 客戶端
- 5.3.1.3 相關閱讀
- 5.3.2 服務端
- 5.3.3 客戶端
- 5.3.4 nginx配置
- 5.3.5 修改版
- 5.3.5.1 草稿 - 1
- 5.3.5.2 草稿 - 2
- 5.3.5.3 草稿 - 3
- 5.3.5.4 服務端
- 5.3.5.5 客戶端
- 5.4 打印客戶端頭部信息
- 第六序 算法
- 6.1 查找
- 6.1.1 二分查找
- 6.2 排序
- 6.2.1 交換排序 - 冒泡排序
- 6.2.2 插入排序 - 直接插入排序
- 6.2.3 插入排序 - 希爾排序
- 6.2.4 交換排序 - 快速排序
- 6.3 算法求解應用
- 第七序 微服務
- 7.1 相關閱讀
- 7.2 gRPC
- 7.2.1 準備工作
- 7.2.2 編譯.proto文件
- 7.2.3 gRPC服務端
- 7.2.4 gRPC客戶端
- 7.3 micro/micro
- 7.3.1 服務發現
- 7.3.2 安裝consul
- 7.3.3 準備工作
- 7.3.4 服務端
- 7.3.5 客戶端
- 7.3.6 默認的服務發現
- 7.3.7 文檔閱讀
- 7.4 protobuf序列化
- 第八序 Web
- 8.1 視圖模板
- 8.1.1 main.go
- 8.1.2 login.html
- 8.2 原生留言板
- 8.2.1 原生sql
- 8.2.1.1 main.go
- 8.2.1.2 view
- 8.2.1.2.1 index.html
- 8.2.1.2.2 create.html
- 8.2.2 sqlx
- 8.3 Gin框架
- 第九序 數據庫
- 9.0 資料收集
- 9.1 Redis數據庫 (gomodule/redigo)
- 9.1.1 介紹
- 9.1.2 消息隊列
- 9.2 Redis數據庫(go-redis/redis)
- 第十序 日記
- 10.1 SimplePanic
- 10.2 第一版日記庫
- 10.2.1 winnielog
- 10.2.2 使用
- 第十一序 中間鍵
- 11.0 資料收集
- 11.1 NSQ
- 11.2 zookeeper
- 11.3 kafka
- 第十二序 加密
- 12.1 Token
- 12.2 SHA1
- 2.3 RSA + AES
- 第十三序 分布式鎖
- 第十四序 標準庫練習
- container/list
- 鏈表
- container/ring
- 環形鏈表
- context
- flag (獲取命令行參數)
- io
- strconv
- sync
- 為什么需要鎖?
- 互斥鎖
- 讀寫鎖
- 條件變量
- 計數器
- 并發安全字典
- 自制并發安全字典
- 官方并發安全字典
- 連接池
- sync/atomic
- 原子操作
- 第十五序 其它內容
- 文件讀寫
- 工作池
- 第十六序 相關閱讀