第三章、Go-內建容器
阿新 • • 發佈:2019-08-02
3.1.陣列
(1)陣列的定義
package main import ( "fmt" ) func main() { //用var定義陣列可以不用賦初值 var arr1 [5]int //[0 0 0 0 0] //用冒號必須指定初值 arr2 := [3]int{1,3,5} //[1 3 5] //用“...”表示任意個數 arr3 := [...]int{2,4,6,8,10} //[2 4 6 8 10] fmt.Println(arr1,arr2,arr3) }
(2)陣列的遍歷
用range關鍵字
package main import ( "fmt" ) func main() { arr3 := [...]int{2,4,6,8,10} //[2 4 6 8 10] fmt.Println(arr3) //陣列的遍歷 for i := range arr3{ fmt.Println(arr3[i]) } } //結果 2 4 6 8 10
獲取下標和值
package main import ( "fmt" ) func main() { arr3 := [...]int{2,4,6,8,10} //[2 4 6 8 10] fmt.Println(arr3) //陣列的遍歷 for i ,v:= range arr3{ fmt.Println(i,v) } } //結果 0 2 1 4 2 6 3 8 4 10
(3)陣列是值型別
- [10]int和[20]int是不同型別
- 呼叫func f(arr [10]int) 會拷貝陣列
- 在go語言中一般不使用陣列,而使用切片
package main import ( "fmt" ) func printArray(arr [5]int){ for i ,v:= range arr{ fmt.Println(i,v) } } func main() { //arr2 := [3]int{1,3,5} arr3 := [...]int{2,4,6,8,10} printArray(arr3) } //結果 0 2 1 4 2 6 3 8 4 10
如果傳arr2則報錯
package main import ( "fmt" ) func printArray(arr [5]int){ for i ,v:= range arr{ fmt.Println(i,v) } } func main() { arr2 := [3]int{1,3,5} //arr3 := [...]int{2,4,6,8,10} printArray(arr2) //cannot use arr2 (type [3]int) as type [5]int in argument to printArray }
3.2.切片
(1)切片
package main import "fmt" func main() { arr := [...]int{0,1,2,3,4,5,6,7} fmt.Println(arr[2:6]) //[2 3 4 5] fmt.Println(arr[:6]) //[0 1 2 3 4 5] fmt.Println(arr[2:]) //[2 3 4 5 6 7] fmt.Println(arr[:]) //[0 1 2 3 4 5 6 7] }
(2)slice的擴充套件
slice可以向後擴充套件,不可以向前擴充套件
package main import "fmt" func main() { arr := [...]int{0,1,2,3,4,5,6,7} s1 := arr[2:6] s2 := s1[3:5] fmt.Println(s1) //[2 3 4 5] fmt.Println(s2) //[5 6] }
s2是如何取到[5,6]的
(3)slice的實現
slice底層隱藏了三個值
s[i]不可以超越len(s),向後擴充套件不可以超越底層陣列cap(s)
package main import "fmt" func main() { arr := [...]int{0,1,2,3,4,5,6,7} s1 := arr[2:6] s2 := s1[3:5] fmt.Println("arr = ",arr) //arr = [0 1 2 3 4 5 6 7] fmt.Printf("s1=%v,len(s1)=%d,cap(s1)=%d\n",s1,len(s1),cap(s1)) //s1=[2 3 4 5],len(s1)=4,cap(s1)=6 fmt.Printf("s2=%v,len(s2)=%d,cap(s2)=%d\n",s2,len(s2),cap(s2)) //s2=[5 6],len(s2)=2,cap(s2)=3 fmt.Println(s1[3:6]) //[5 6 7] }
3.3.切片的操作
(1)向slice新增元素
- 新增元素時,如果超出了cap,系統會重新分配更大的底層陣列
- 由於值傳遞的關係,必須接收append的返回值。s = append(s,val)
package main import "fmt" func main() { arr := [...]int{0,1,2,3,4,5,6,7} s1 := arr[2:6] //[2 3 4 5] s2 := s1[3:5] //[5 6] s3 := append(s2,10) s4 := append(s3,11) s5 := append(s4,12) fmt.Println(s3,s4,s5) //[5 6 10] [5 6 10 11] [5 6 10 11 12] //因為s2的cap是[5,6,7],s3 append把7替換成10,s4後超出了cap fmt.Println(arr) //[0 1 2 3 4 5 6 10] }
(2)slice的建立
package main import "fmt" func main() { //第一種 //Zero value for slice is nil var s1 []int fmt.Println(s1) //[] for i := 0; i < 5 ; i++{ s1 = append(s1,i) } fmt.Println(s1) //[0 1 2 3 4] //第二種 s2 := []int{2,4,6,8} fmt.Printf("len(s2)=%d,cap(s2)=%d\n",len(s2),cap(s2)) //len(s2)=4,cap(s2)=4 //第三種 s3 := make([]int,16) fmt.Printf("len(s3)=%d,cap(s3)=%d\n",len(s3),cap(s3)) //len(s3)=16,cap(s3)=16 //第四種 s4 := make([]int,16,32) fmt.Printf("len(s4)=%d,cap(s4)=%d\n",len(s4),cap(s4)) //len(s4)=16,cap(s4)=32 }
(3)slice的刪除
package main import "fmt" func main() { s1 := []int{0,1,2,3,4,5,6} fmt.Println(s1) //[0 1 2 3 4 5 6] //刪除index為3的值 s1 = append(s1[:3],s1[4:]...) fmt.Println(s1) //[0 1 2 4 5 6] }