陣列
陣列索引是從 0 開始, 以索引 (index) 對陣列賦值。
附上Code:
package main
import "fmt"
func main() {
fmt.Println("===一維數組===")
//var
var arr [3]int
fmt.Println(arr[0])
fmt.Println(len(arr))
fmt.Println(arr[len(arr)-1])
//for _, v := range arr{
// fmt.Printf("%d \n", v)
//}
for i, v := range arr {
fmt.Printf("%d %d \n", i, v)
}
//0
//3
//0
//0 0
//1 0
//2 0
var arr1 [3]int = [3]int{1, 3, 5}
fmt.Println(arr1[2]) //5
arr2 := [...]int{1, 3, 5}
fmt.Println(arr2[2]) //5
fmt.Println(arr1 == arr2) //true
for i, v := range arr2 {
fmt.Printf("%d %d \n", i, v)
}
//0 1
//1 3
//2 5
fmt.Println("===多維數組===")
//var arr3 [4][2]int //宣告方式
arr3 := [4][2]int{{11, 22}, {12, 23}, {45, 62}, {83, 26}}
fmt.Println(arr3[0][0]) //11
fmt.Println(arr3[3][1]) //26
//fmt.Println(arr3[4][2]) //超過會報錯
fmt.Println("======")
arr4 := [4][2]int{1: {11, 22}, 3: {31, 36}}
fmt.Println(arr4[0][0]) //0
fmt.Println(arr4[1][0]) //11
fmt.Println(arr4[2][0]) //0
fmt.Println(arr4[3][1]) //36
fmt.Println("======")
arr5 := [4][3]int{1: {0: 100}, 3: {2: 33}}
fmt.Println(arr5[1][0]) //100
fmt.Println(arr5[3][2]) //33
fmt.Println(arr5[1][1]) //0
arr5[1][1] = 66 //賦值
fmt.Println(arr5[1][1]) //66
}
切片
使用 make() 函數來創建切片:
var slice1 []type = make([]type, len)
// 也可以簡寫為
slice1 := make([]type, len)
//slice11 := make([]int, len)
package main
import (
"fmt"
)
func main() {
//slice [開始位置:結束位置]
var arr = [3]int{1, 2, 3}
fmt.Println(arr, arr[1:2]) //[1 2 3] [2]
var arr1 = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println(arr1[2:5]) // [3 4 5]
fmt.Println(arr1[:5]) //[1 2 3 4 5]
fmt.Println(arr1[5:]) //[6 7 8 9 10]
fmt.Println(arr1[:]) //[1 2 3 4 5 6 7 8 9 10] //跟 [0:10], [:10]一樣
fmt.Println(arr1[0:0]) //[0]
//var name[]Type
//var stringSlice []string
//var numberSlice []int
//var numberEmptySlice []int
//make([]Type, size. cap) // make 並不會回傳指標
a := make([]int, 2)
b := make([]int, 2, 10)
fmt.Println(a, b) //[0 0] [0 0]
}
append 添加元素
package main
import (
"fmt"
)
func main() {
var a, b []int
a = append(a, 1) // 追加一個元素
fmt.Println(a) //[1]
b = append(b, 1, 2, 3) // 追加三個元素
fmt.Println(b) //[1 2 3]
b = append(b, []int{4, 6, 8}...) // 從後方添加
fmt.Println(b) //[1 2 3 4 6 8]
var sli []int
for i := 0; i < 10; i++ {
sli = append(sli, i)
fmt.Printf("長度:%d,容量:%d,地址:%p\n", len(sli), cap(sli), sli)
}
//長度:1,容量:1,地址:0xc00000e128
//長度:2,容量:2,地址:0xc00000e130
//長度:3,容量:4,地址:0xc0000141e0
//長度:4,容量:4,地址:0xc0000141e0
//長度:5,容量:8,地址:0xc000012280
//長度:6,容量:8,地址:0xc000012280
//長度:7,容量:8,地址:0xc000012280
//長度:8,容量:8,地址:0xc000012280
//長度:9,容量:16,地址:0xc00010c000
//長度:10,容量:16,地址:0xc00010c000
var r = []int{1, 2, 3}
r = append([]int{0}, r...) //從前面加了0
fmt.Println(r) //[0 1 2 3]
r = append([]int{-4, -3, -2, -1}, r...)
fmt.Println(r) //[-4 -3 -2 -1 0 1 2 3]
//盡量不要從前面去加
// 一般容量會大於長度
}
copy
copy() 可以將一個數組切片複製到另一個數組切片中,如果加入的兩個數組切片不一樣大,就會按照其中較小的那個數組切片的元素個數進行複制。
範例1:
package main
import (
"fmt"
)
func main() {
// copy(目標切片, 源切片)類型
slice1 := []int{1, 2, 3, 4, 5, 6}
slice2 := []int{7, 8, 9}
slice3 := []int{9, 8, 7}
//copy(slice1, slice2) //複製 7 8 9 到s1 的1 2 3 位置
copy(slice1, slice2)
fmt.Println(slice1) //[7 8 9 4 5 6]
fmt.Println(slice2) //[7 8 9]
fmt.Println("=========")
// 與長度有關, 會將 7 8 9 複製到slice3
copy(slice3, slice1)
fmt.Printf("slice1:%d, slice3:%d \n", slice1, slice3)
// slice1:[7 8 9 4 5 6], slice3:[7 8 9][7 8 9]
}
package main
import "fmt"
func main() {
// copy(目標切片, 源切片)類型
const len = 10 //const常量是一個簡單值的標識符,在程序運行時,不會被修改的量。
//創建切片var slice1 []type = make([]type, len)
slice11 := make([]int, len)
for i := 0; i < len; i++ {
slice11[i] = i
}
slice33 := slice11
slice22 := make([]int, len)
copy(slice22, slice11)
fmt.Println(slice11) //[0 1 2 3 4 5 6 7 8 9]
fmt.Println(slice22) //[0 1 2 3 4 5 6 7 8 9]
fmt.Println(slice33) //[0 1 2 3 4 5 6 7 8 9]
slice11[0] = 999
fmt.Println(slice11[0]) //999
fmt.Println(slice22[0]) //0 不受影響
fmt.Println(slice33[0]) //999
}
刪除元素
package main
import "fmt"
func main() {
//刪除元素
//方法
var a = []int{1, 2, 3}
a = a[2:]
fmt.Println(a) //[3]
//方法-append
var b = []int{1, 2, 3, 4, 5, 6}
fmt.Println(b[:1]) //[1]
b = append(b[:1], b[4:]...)
fmt.Println(b) //[1 5 6]
//方法-copy
var c = []int{1, 2, 3, 4, 5, 6, 7}
c = c[:copy(c, c[3:])] // 與append類似
fmt.Println(c) // [4 5 6 7]
//試者了解這取值的過程
fmt.Println(c) //[4 5 6 7 5 6 7]
fmt.Println(c[3:]) //[4 5 6 7]
fmt.Println(copy(c, c[3:])) //4
fmt.Println(c[:4]) //[4 5 6 7]
// 方法 - append
var d = []int{1, 2, 3, 4, 5}
fmt.Println(d[3+1:]) //[5]
fmt.Println(d[:3]) //[1 2 3]
// d = append(d[:N], d[N+1:]...)
d = append(d[:3], d[3+1:]...)
fmt.Println(d) //[1 2 3 5]
// 方法 - copy
var e = []int{1, 2, 3, 4, 5}
e = e[:2+copy(e[2:], e[2+1:])]
fmt.Println(e)//[1 2 4 5]
//方法-slice
slice1 := []int{1, 2, 3, 4, 5, 6, 7, 8}
index := 2
fmt.Println(slice1[:index], slice1[index+1:]) //[1 2] [4 5 6 7 8]
slice1 = append(slice1[:index], slice1[index+1:]...)
fmt.Println(slice1) //[1 2 4 5 6 7 8]
}