Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Fungsi universal untuk menukar Peta kepada Senarai dalam GO

Fungsi universal untuk menukar Peta kepada Senarai dalam GO

WBOY
WBOYke hadapan
2024-02-13 20:30:12749semak imbas

GO 中将 Map 转换为 List 的通用函数

editor php Strawberry memperkenalkan anda kepada alat praktikal yang dipanggil "Fungsi universal untuk menukar Peta kepada Senarai dalam GO". Fungsi ini boleh membantu anda menukar struktur data peta nilai kunci (Peta) kepada struktur data senarai (Senarai). Melalui fungsi umum ini, anda boleh menukar struktur data kompleks dengan mudah kepada bentuk yang lebih ringkas, meningkatkan kebolehbacaan dan kebolehselenggaraan kod anda. Sama ada anda pernah menghadapi keperluan yang sama dalam pembangunan atau ingin mengetahui lebih banyak teknik tentang penukaran struktur data, fungsi universal ini akan membawa kemudahan dan inspirasi kepada anda. Mari kita terokai alat berguna ini bersama-sama!

Kandungan soalan

Bagaimana untuk menulis fungsi dalam go yang menukar mana-mana peta kepada senarai objek (mengalih keluar kekunci)?

Contohnya:

func maptolist(inputmap map[any]any) any {
    var resultlist []any 
    for _, obj := range inputmap {
        resultlist = append(resultlist, obj)
    }
    return resultlist
}

func main() {
    mymap := make(map[string]string)
    mymap["a"] = "1"
    mymap["b"] = "12"
    l := maptolist(mymap).([]string)
    fmt.printf("(%v, %t)\n", l, l)
}

akan mengeluarkan: ([1 12], []string)

Tetapi saya sentiasa menghadapi masalah jenis dan tidak menemui penyelesaian. Saya mempunyai masalah yang sama menggunakan penegasan atau penukaran jenis.

cannot use myMap (variable of type map[string]string) as map[any]any value in argument to mapToList

Bagaimanakah saya harus menulis fungsi maptolist()?

Ia mesti diambil sebagai input inputmap map[any]anyinputmap any kerana saya mahu menghantar sebarang jenis peta (map[string]customstruct; map[int][]customstruct dsb.)

Kemas kini: Saya menambah fungsi dan butiran lanjut tentang input semasa saya mula-mula menulisnya

Penyelesaian

Lihat tutorial ini tentang generik atau Spesifikasi Bahasa

any不是变量类型,它是一个type约束,可以使用的类型的描述。您需要使用约束 any Tentukan parameter jenis dan kemudian rujuk jenis generik daripada tandatangan parameter.

//                                 | from this point on, k and v are
//                                 | now valid types to use in the function
func maptoslice[k comparable, v any](m map[k]v) []v {
    s := make([]v, 0, len(m))
    for _, v := range m {
        s = append(s, v)
    }
    return s
}

parameterm必须是map[k]v,其中kcomparable类型,vany类型。返回类型 []v akan menjadi kepingan daripada jenis yang sama seperti nilai dalam peta input.

Sila ambil perhatian, any 不能用作映射键的约束,因为并非所有类型都可以用作键,只有 可比较的 taip.

Kemudian, untuk memanggil kaedah, masukkan jenis yang memenuhi kekangan (cth. map[string][]string), secara pilihan memaparkan parameter jenis secara eksplisit.

m := map[string][]string{
    "a": {"b", "c"},
    "d": {"e", "f"},
}
s := maptoslice(m)
// or
t := maptoslice[string, []string](m)
// [[b c] [e f]]

Dengan bersikap eksplisit tentang jenis, anda boleh mendokumenkan kod anda sendiri dan menangkap sebarang isu jenis yang tidak dijangka. Sebagai contoh, kod berikut akan mengembalikan ralat:

v := mapToSlice[string, []int](m)
...
./main.go:14:33: cannot use m (variable of type map[string][]string) as map[string][]int value in argument to mapToSlice[string, []int]

Atas ialah kandungan terperinci Fungsi universal untuk menukar Peta kepada Senarai dalam GO. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam