[英]Array of arrays in Go or Rust?
我正在將一些舊的PHP腳本移植到Go中,以實現更好的性能。 但是,舊的PHP充滿了多維數組。 來自代碼庫的一些摘錄:
while (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) {
$someData[$row['column_a']][$row['column_b']] = $row;
}
// ... more queries and stuff
if (isset($moreData['id']) && isset($anotherData['id']) && $someData[$anotherData['id']][$moreData['id']]) {
echo $someData[$anotherData['id']][$moreData['id']];
}
糟糕,我知道,但是我無法改變邏輯。 通過使用phc進行編譯,我使整個腳本的性能大大提高,但改用程序化,靜態類型的語言似乎是更好的選擇。 如何使用Go或Rust高效地復制那些數據結構? 在檢查索引時,它必須是容錯的,腳本周圍有很多isset來檢查數據結構中是否存在標識符。
在Go中,這將表示為map
。 語法為map[key]value
。 因此,例如,要存儲[string, string] -> int
的多維映射,它將是map[string]map[string]int
。 如果您知道索引是整數並且緊密堆積,那么您將要使用切片。 那些更簡單,看起來像[][]type
。
至於檢查現有鍵,請使用以下語法,其中m是映射:
if val, ok := m[key1][key2]; ok {
///Do something with val
}
請記住,要向多維地圖添加鍵,必須在添加內部地圖之前確保已分配內部地圖。
if _, ok := m[key]; !ok {
m[key] = make(map[string]int)
}
m[key1][key2] = value
顯然,您希望將其包裝為帶有方法或一些簡單函數的類型。
PHP數組實際上是關聯數組 ,也稱為映射或字典 。 Rust在其標准庫中使用名稱Map 。 Map
特征提供了多種實現的接口。 特別地,此特征定義了一個contains_key
方法,可用於檢查地圖是否包含特定鍵(而不是編寫isset($array[$key])
,而是編寫map.contains_key(key)
)。
Map
有兩個類型參數: K
是地圖的鍵的類型(即,用作索引的值),而V
是地圖的值的類型。
如果您需要地圖包含各種類型的鍵和/或值,則需要使用Any
trait 。 例如,如果鍵是字符串,並且值是各種類型,則可以使用HashMap<String, Box<Any>>
( Box
是必需的,因為特征對象未調整大小;有關更多信息,請參見此答案 )。 查看有關AnyRefExt
和AnyMutRefExt
的文檔,以了解如何使用Any
值。
但是,如果可能的類型相對有限,那么定義自己的特征並使用該特征(而不是Any
可能會更容易,這樣您就可以在這些類型上實現操作,而不必在需要使用值的地方進行顯式轉換(另外,您可以通過添加一個impl
來添加類型,而不必更改所有使用值的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.