簡體   English   中英

如何將地圖轉換為條目切片?

[英]How to convert a map to a slice of entries?

我正在嘗試將鍵值映射轉換為對切片,例如給定如下映射:

m := make(map[int64]int64)
m[521] = 4
m[528] = 8

如何將其轉換為條目的一部分,例如: [[521, 4], [528, 8]]

我正在考慮遍歷所有這些鍵值然后為此創建切片,但是有沒有簡單的代碼可以做到這一點?

package main

import "fmt"

func main() {
    //create a map
    m := map[int64]int64{512: 8, 513: 9, 234: 9, 392: 0}

    //create a slice to hold required values
    s := make([][]int64, 0)

    //range over map `m` to append to slice `s`
    for k, v := range m {

        // append each element, with a new slice []int64{k, v}
        s = append(s, []int64{k, v})
    }

    fmt.Println(s)
}

去 1.18

現在可以編寫一個通用函數來提取所有鍵值對,即映射條目,具有任何鍵和值類型。

筆記:

  • 地圖迭代仍然是無序的——使用泛型不會改變這一點。
  • 映射鍵的約束必須是可比較
type Pair[K, V any] struct {
    First  K
    Second V
}

func Entries[M ~map[K]V, K comparable, V any](m M) []Pair[K, V] {
    entries := make([]Pair[K, V], 0)
    for k, v := range m {
        entries = append(entries, Pair[K, V]{k, v})
    }
    return entries
}

這里的類型Pair用於在返回值中保持類型安全。 如果你真的必須返回一個切片,那么它只能是[][]any (或[][2]any )以保存不同的類型。

如果映射鍵和值具有相同的類型,當然您仍然可以使用Pair但您也可以使用上述類型安全的變體:

func Entries[T comparable](m map[T]T) [][2]T {
    entries := make([][2]T, 0)
    for k, v := range m {
        entries = append(entries, [2]T{k, v})
    }
    return entries
}

同樣, T必須具有comparable或更嚴格才能用作映射鍵。

游樂場: https ://go.dev/play/p/RwCGmp7MHKW

暫無
暫無

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

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