PHP轉Go系列:陣列與切片
陣列的定義
用過PHP的同學應該很清楚,無論多麼複雜的資料格式都可以用陣列來表達,什麼型別的資料都可以往裡塞,它是工作必備的一部分,使用很簡單,易用程度簡直變態。
$array = [1, 'name', ['sex' => '男']];
在Go語言中就有所不同了,陣列是一段固定長度的連續記憶體區域,與C語言概念完全一致,在宣告陣列時,要先確定陣列的長度,而且陣列中的元素只能使用一種型別,心痛,我們再也不能隨心所欲的儲存資料了。
array := [3]int{1, 2, 3}
以上是陣列在Go語言中的定義方法,[3]
代表陣列長度為3,int
$array = [];
$array[0] = 'name';
$array[1] = 1;
print_r($array);
//output
Array
(
[0] => name
[1] => 1
)
Go語言也能做到,不過別想那麼多,要儲存不同資料型別的元素就別想了(其實也不是沒有辦法,後續文章講解)。可以通過var宣告一個數組,陣列的長度和型別提前定義好,接下來就可以根據陣列下標來賦值了,可以不必為每個下標賦值,但是切記下標不能越界,否則會報錯。
var array [3]string
array[0] = "name"
array[1] = "sex"
fmt.Print(array) //output [name sex ]
每次宣告陣列時都要數一下元素個數寫在中括號裡也太雞肋了,這點Go不可能想不到,果然,可以用...
方法來省略掉中括號的數值,這樣編譯器會自動確定陣列中的元素。
array := [...]string{"a", "b", "c", "d"} fmt.Print(array) //output [a b c d]
陣列的遍歷
陣列已經定義了,來看一下怎麼遍歷,在PHP中通過foreach
進行遍歷。
$array = ["a", "b", "c", "d"];
foreach($array as $k => $v) {
echo $v;
}
//output abcd
Go的寫法很類似,通過range
進行遍歷,只是語法看起來有點怪怪的。
array := [...]string{"a", "b", "c", "d"}
for k, v := range array {
fmt.Print(k, v)
}
//output 0a1b2c3d
在Go中沒有使用的變數在編譯時會報錯,那遍歷時的k不見得會用到,那怎麼解決變數k未被使用的問題呢?其實可以使用Go內建的符號_
來替換掉變數k,它的意思是把當前賦的值丟棄掉。
array := [...]string{"a", "b", "c", "d"}
for _, v := range array {
fmt.Print(v)
}
//output abcd
陣列的擷取
PHP中對陣列擷取通過array_slice
函式,以下程式碼是從陣列的第二個元素開始,擷取兩個元素。
$array = [1, 2, 3, 4, 5];
print_r(array_slice($array, 1, 2));
//output
Array
(
[0] => 2
[1] => 3
)
在Go中更簡單一些,可以直接取出第二到第四個元素之間的資料,值得注意的是,取出來的已經不是陣列了,叫做切片,記住了,從陣列切出來的部分就叫切片,陣列與切片最簡單的區別就是:陣列需要明確指定大小,切片不需要,陣列是值傳遞,切片是地址傳遞。不過目前還是把它當陣列好了。
array := [...]int{1, 2, 3, 4, 5}
fmt.Print(array[1:3])
陣列的追加
在PHP中為陣列新增一個新元素使用array_push
函式。
$array = [1, 2, 3, 4, 5];
array_push($array, 6);
print_r($array);
//output
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
)
在Go中使用append
函式,注意這裡實際上是對切片的新增而不是陣列。
array := []int{1, 2, 3, 4, 5}
array = append(array, 6)
fmt.Print(array) //output [1 2 3 4 5 6]
陣列元素的刪除
在PHP中刪除陣列元素非常簡單,直接unset
即可,以下程式碼是刪除第二個元素。
$array = [1, 2, 3, 4, 5];
unset($array[1]);
print_r($array);
//output
Array
(
[0] => 1
[2] => 3
[3] => 4
[4] => 5
)
Go中比較特別,它並沒有提供原生的刪除方法,只能利用切片的特性,我們定義刪除的元素索引為1,然後將1前面的元素與1後面的元素拼接起來,就過濾掉了第1個元素,感覺這種實現方式有點投機,不知道為什麼不提供函式來操作。
index := 1
array := []int{1, 2, 3, 4, 5}
array = append(array[:index], array[index+1:]...)
fmt.Print(array) //output [1 3 4 5]
以上就是PHP與Go在陣列上的區別,感興趣的同學可以自行了解或關注我後續的文章