簡體   English   中英

Go或Rust中的數組數組?

[英]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是必需的,因為特征對象未調整大小;有關更多信息,請參見此答案 )。 查看有關AnyRefExtAnyMutRefExt的文檔,以了解如何使用Any值。

但是,如果可能的類型相對有限,那么定義自己的特征並使用該特征(而不是Any可能會更容易,這樣您就可以在這些類型上實現操作,而不必在需要使用值的地方進行顯式轉換(另外,您可以通過添加一個impl來添加類型,而不必更改所有使用值的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM