Hi,大家好,
我是明哥,在自己學習 Golang 的這段時間里,我寫了詳細的學習筆記放在我的個人微信公眾號 《Go編程時光》,對于 Go 語言,我也算是個初學者,因此寫的東西應該會比較適合剛接觸的同學,如果你也是剛學習 Go 語言,不防關注一下,一起學習,一起成長,
我的在線博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime
1. 陣列
陣列是一個由固定長度的特定型別元素組成的序列,一個陣列可以由零個或多個元素組成,因為陣列的長度是固定的,所以在Go語言中很少直接使用陣列,
宣告陣列,并給該陣列里的每個元素賦值(索引值的最小有效值和其他大多數語言一樣是 0,不是1)
// [3] 里的3 表示該陣列的元素個數
var arr [3]int
arr[0] = 1
arr[1] = 2
arr[2] = 3
宣告并直接初始化陣列
// 第一種方法
var arr [3]int = [3]int{1,2,3}
// 第二種方法
arr := [3]int{1,2,3}
上面的 3 表示陣列的元素個數 ,萬一你哪天想往該陣列中增加元素,你得對應修改這個數字,為了避免這種硬編碼,你可以這樣寫,使用 ... 讓Go語言自己根據實際情況來分配空間,
arr := [...]int{1,2,3}
[3]int 和 [4]int 雖然都是陣列,但他們卻是不同的型別,使用 fmt 的 %T 可以查得,
import (
"fmt"
)
func main() {
arr01 := [...]int{1, 2, 3}
arr02 := [...]int{1, 2, 3, 4}
fmt.Printf("%d 的型別是: %T\n", arr01, arr01)
fmt.Printf("%d 的型別是: %T", arr02, arr02)
}
輸出 如下
[1 2 3] 的型別是: [3]int
[1 2 3 4] 的型別是: [4]int
如果你覺得每次寫 [3]int 有點麻煩,你可以為 [3]int 定義一個型別字面量,也就是別名型別,
使用 type 關鍵字可以定義一個型別字面量,后面只要你想定義一個容器大小為3,元素型別為int的陣列 ,都可以使用這個別名型別,
import (
"fmt"
)
func main() {
type arr3 [3]int
myarr := arr3{1,2,3}
fmt.Printf("%d 的型別是: %T", myarr, myarr)
}
輸出 如下
[1 2 3] 的型別是: main.arr3
2. 切片
切片(Slice)與陣列一樣,也是可以容納若干型別相同的元素的容器,與陣列不同的是,無法通過切片型別來確定其值的長度,每個切片值都會將陣列作為其底層資料結構,我們也把這樣的陣列稱為切片的底層陣列,
切片是對陣列的一個連續片段的參考,所以切片是一個參考型別,這個片段可以是整個陣列,也可以是由起始和終止索引標識的一些項的子集,需要注意的是,終止索引標識的項不包括在切片內(意思是這是個左閉右開的區間)
import (
"fmt"
)
func main() {
myarr := [...]int{1, 2, 3}
fmt.Printf("%d 的型別是: %T", myarr[0:2], myarr[0:2])
}
輸出 如下
[1 2] 的型別是: []int
切片的構造,有三種方式
-
對陣列進行片段截取(上面例子已經展示:myarr[0:2],0是索引起始值,2是索引終止值,區間左半右開)
-
從頭宣告賦值(例子如下)
// 宣告字串切片 var strList []string // 宣告整型切片 var numList []int // 宣告一個空切片 var numListEmpty = []int{} -
使用 make 函式構造,make 函式的格式:
make( []Type, size, cap )這個函式剛好指出了,一個切片具備的三個要素:型別(Type),長度(size),容量(cap)
import ( "fmt" ) func main() { a := make([]int, 2) b := make([]int, 2, 10) fmt.Println(a, b) fmt.Println(len(a), len(b)) fmt.Println(cap(a), cap(b)) }輸出 如下
[0 0] [0 0] 2 2 2 10
關于 len 和 cap 的概念,可能不好理解 ,這里舉個例子:
-
公司名,相當于字面量,也就是變數名,
-
公司里的所有工位,相當于已分配到的記憶體空間
-
公司里的員工,相當于元素,
-
cap 代表你這個公司最多可以容納多少員工
-
len 代表你這個公司當前有多少個員工
由于 切片是參考型別,所以你不對它進行賦值的話,它的零值(默認值)是 nil
var myarr []int
fmt.Println(myarr == nil)
// true
陣列 與 切片 有相同點,它們都是可以容納若干型別相同的元素的容器
也有不同點,陣列的容器大小固定,而切片本身是參考型別,它更像是 Python 中的 list ,我們可以對它 append 進行元素的添加,
import (
"fmt"
)
func main() {
myarr := []int{1}
// 追加一個元素
myarr = append(myarr, 2)
// 追加多個元素
myarr = append(myarr, 3, 4)
// 追加一個切片, ... 表示解包,不能省略
myarr = append(myarr, []int{7, 8}...)
// 在第一個位置插入元素
myarr = append([]int{0}, myarr...)
// 在中間插入一個切片(兩個元素)
myarr = append(myarr[:5], append([]int{5,6}, myarr[5:]...)...)
fmt.Println(myarr)
}
輸出 如下
[0 1 2 3 4 5 6 7 8]
最后,給你留一道思考題,如下 這段代碼
import (
"fmt"
)
func main() {
var numbers4 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
myslice := numbers4[4:6:8]
fmt.Printf("myslice為 %d, 其長度為: %d\n", myslice, len(myslice))
myslice = myslice[:cap(myslice)]
fmt.Printf("myslice的第四個元素為: %d", myslice[3])
}
為什么 myslice 的長度為2,卻能訪問到第四個元素
myslice為 [5 6], 其長度為: 2
myslice的第四個元素為: 8
系列導讀
01. 開發環境的搭建(Goland & VS Code)
02. 學習五種變數創建的方法
03. 詳解資料型別:****整形與浮點型
04. 詳解資料型別:byte、rune與string
05. 詳解資料型別:陣列與切片
06. 詳解資料型別:字典與布爾型別
07. 詳解資料型別:指標
08. 面向物件編程:結構體與繼承
09. 一篇文章理解 Go 里的函式
10. Go語言流程控制:if-else 條件陳述句
11. Go語言流程控制:switch-case 選擇陳述句
12. Go語言流程控制:for 回圈陳述句
13. Go語言流程控制:goto 無條件跳轉
14. Go語言流程控制:defer 延遲呼叫
15. 面向物件編程:介面與多型
16. 關鍵字:make 和 new 的區別?
17. 一篇文章理解 Go 里的陳述句塊與作用域
18. 學習 Go 協程:goroutine
19. 學習 Go 協程:詳解信道/通道
20. 幾個信道死鎖經典錯誤案例詳解
21. 學習 Go 協程:WaitGroup
22. 學習 Go 協程:互斥鎖和讀寫鎖
23. Go 里的例外處理:panic 和 recover
24. 超詳細解讀 Go Modules 前世今生及入門使用
25. Go 語言中關于包匯入必學的 8 個知識點
26. 如何開源自己寫的模塊給別人用?
27. 說說 Go 語言中的型別斷言?
28. 這五點帶你理解Go語言的select用法

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20863.html
標籤:Go
