PHP轉Go系列:map對映

平也發表於2019-06-14

對映的定義

初識對映會很懵,因為在PHP中沒有對映型別的定義。其實沒那麼複雜,任何複雜的型別在PHP中都可以用陣列表示,對映也不例外。

$array['name'] = '平也';
$array['sex'] = '1';
$array['age'] = '10';

//output
Array
(
    [name] => 平也
    [sex] => 1
    [age] => 10
)

對映其實就是有key有value的陣列,在Go中的賦值也很類似,但需要提前宣告該對映型別的鍵與值的型別,確保所有的鍵和值的賦值型別統一,否則會報錯。

array := make(map[string]string)
array["name"] = "平也"
array["sex"] = "1"
array["age"] = "10"
fmt.Print(array) //output map[age:10 name:平也 sex:1]

在PHP中還有一種初始化陣列的方法,就是將所有要儲存的鍵與值賦值給變數。

$array = [
    'name' => '平也',
    'sex' => '1',
    'age' => '10'
];

在Go中也有類似的初始化方法,但切記統一鍵與值的資料型別。

array := map[string]string{
    "name": "平也",
    "sex":  "1",
    "age":  "10",
}

對映的遍歷

在PHP中其實就是遍歷陣列的操作,foreach即可。

$array = [
    'name' => '平也',
    'sex' => '1',
    'age' => '10'
];

foreach ($array as $key => $value) {
    print_r($array);
}

//output
Array
(
    [name] => 平也
    [sex] => 1
    [age] => 10
)
Array
(
    [name] => 平也
    [sex] => 1
    [age] => 10
)
Array
(
    [name] => 平也
    [sex] => 1
    [age] => 10
)

在Go中也可以像遍歷陣列那樣遍歷map,依然使用range關鍵字。

array := map[string]string{
    "name": "平也",
    "sex":  "1",
    "age":  "10",
}
for v, k := range array {
    fmt.Print(k, v)
}

上篇文章講到遍歷時可以通過下劃線來忽略鍵或值,如果只遍歷鍵,下劃線也可以省略。

array := map[string]string{
    "name": "平也",
    "sex":  "1",
    "age":  "10",
}
for k := range array {
    fmt.Print(k)
}
//output sexagename

對映的取值

PHP中可以直接通過讀陣列的key來取值。

$array = ['name' => 'pingye'];
echo $array['name']; //output pingye

在Go中的操作是一樣的,與PHP不同的是,如果取了不存在的key,Go中預設輸出空值,在PHP中就會產生warning警告。

array := map[string]string{
    "name": "pingye",
    "sex":  "1",
    "age":  "10",
}
fmt.Print(array["name"]) //pingye

對映元素的刪除

在PHP中的unset可以刪除任何你想刪除的陣列元素,非常好用。

$array = [
    'name' => '平也',
    'sex' => '1',
    'age' => '10'
];
unset($array['name']);
print_r($array);

//output
Array
(
    [sex] => 1
    [age] => 10
)

在Go中通過delete函式來刪除map中的元素。

array := map[string]string{
    "name": "pingye",
    "sex":  "1",
    "age":  "10",
}
delete(array, "name")
fmt.Print(array) //output map[age:10 sex:1]

清空map元素

在PHP中好像從來沒有注意過是否把陣列清空,很抱歉,我能想到的清空陣列方法就是把空陣列賦值給它。

$array = [
    'name' => '平也',
    'sex' => '1',
    'age' => '10'
];
$array = [];
print_r($array);
//output
Array
(
)

然而,在Go中也沒有提供清空map的函式,重新make一個map就行了,原來的map會被Go的垃圾回收機制清除掉,甚至比寫一個清空的函式效率還高。以上是PHP與Go在map對映方面的區別於聯絡,如果感興趣可以自行了解嘗試。

相關文章