Pergi: Cara menggunakan antara muka dalam peta dan kepingan

PHPz
Lepaskan: 2024-02-10 20:57:08
ke hadapan
1226 orang telah melayarinya

Pergi: Cara menggunakan antara muka dalam peta dan kepingan

Editor PHP Apple akan memperkenalkan anda cara menggunakan antara muka dalam peta dan menghiris. Dalam pembangunan web moden, peta dan jubin adalah keperluan fungsian biasa. Menggunakan antara muka boleh menjadikan operasi peta dan jubin lebih fleksibel dan berskala. Artikel ini akan menerangkan secara terperinci konsep antara muka dan cara menggunakan antara muka untuk melaksanakan pelbagai fungsi dalam peta dan jubin. Dengan membaca artikel ini, anda akan belajar cara mengoptimumkan penggunaan peta dan jubin untuk meningkatkan pengalaman dan prestasi pengguna. Mari kita terokai topik menarik ini bersama-sama!

Kandungan soalan

Saya memerlukan peta antara muka kerana saya mahu dapat menjalankan fungsi yang boleh menggunakan pelaksanaan konkrit sama ada antara muka, tanpa mengambil berat tentang perkara "tambahan" yang boleh dilakukan oleh struktur ini.

Saya membaca https://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go dan ia mempunyai penjelasan yang baik tentang petunjuk dan antara muka tetapi saya masih tidak tahu cara melakukannya dalam amalan Ingin benda.

Saya sedang mencuba kod berikut:

https://play.golang.com/p/nrh2iyk7t9f

package main

import (
    "fmt"
)

type iexample interface {
    getname() string
}

type concrete struct {
    name string
}

func (c *concrete) getname() string {
    return c.name
}

func main() {
    // in my real application this is a slice returned from gorm orm
    var s = []concrete{
        concrete{name: "one"},
        concrete{name: "two"},
    }

    foo := make(map[string]iexample)
    bar := []iexample{}

    for _, c := range s {
        foo[c.name] = &c
        bar = append(bar, &c)
        fmt.printf("set key [%s]\r\n", c.name)
    }

    for name, element := range foo {
        fmt.printf("key: [%s] has element [%s]\r\n", name, element.getname())
    }
    for name, element := range bar {
        fmt.printf("key: [%d] has element [%s]\r\n", name, element.getname())
    }

}
Salin selepas log masuk

Keluaran:

set key [one]
set key [two]
key: [one] has element [two]
key: [two] has element [two]
key: [0] has element [two]
key: [1] has element [two]
Salin selepas log masuk

Apa yang saya mahukan ialah elemen satu berada dalam kunci "satu".

Saya rasa masalah berlaku kerana menggunakan petikan foo[c.name] = &c 进行的分配。我需要这个,因为否则我会收到错误“cannot use c (concrete 类型的变量) 作为赋值中的 iexample 值:concrete 未实现 iexample(方法 getname 有指针接收器)"

Selepas membaca https://dusted.codes/using-go-generics-to-pass-struct-slices-for-interface-slices Saya ingin tahu sama ada saya boleh menggunakan generik untuk menyelesaikan masalah tetapi saya tidak tahu macam mana nak buat.

type ExampleMap map[string]IExample

func (e *ExampleMap) add[T IExample](id string item T) {
    e[id] = item
}
// syntax error: method must have no type parameters
Salin selepas log masuk

Bagaimana untuk menjadikan peta ini mengandungi elemen yang betul?

Penyelesaian

Apa yang anda lakukan adalah betul. Anda hanya meletakkan perkara yang salah ke dalam peta:

for i,c := range s {
        foo[c.Name] = &s[i]
        bar = append(bar, &s[i])
        fmt.Printf("Set key [%s]\r\n", c.Name)
    }
Salin selepas log masuk

Pembolehubah gelung ditimpa pada setiap lelaran, jadi apabila anda menetapkan alamat &c 添加到映射和切片时,您添加的指针就是 c , alamat tersebut ditimpa pada setiap lelaran.

Atas ialah kandungan terperinci Pergi: Cara menggunakan antara muka dalam peta dan kepingan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!