Heim >Backend-Entwicklung >Golang >Go: So verwenden Sie Schnittstellen in Karten und Slices

Go: So verwenden Sie Schnittstellen in Karten und Slices

PHPz
PHPznach vorne
2024-02-10 20:57:081271Durchsuche

Go: So verwenden Sie Schnittstellen in Karten und Slices

PHP-Editor Apple stellt Ihnen vor, wie Sie Schnittstellen in Karten und Slicing verwenden. In der modernen Webentwicklung sind Karten und Slicing gängige funktionale Anforderungen. Durch die Verwendung von Schnittstellen können Karten- und Kacheloperationen flexibler und skalierbarer werden. In diesem Artikel wird das Konzept von Schnittstellen ausführlich erläutert und erläutert, wie Schnittstellen zum Implementieren verschiedener Funktionen in Karten und Kacheln verwendet werden. Durch die Lektüre dieses Artikels erfahren Sie, wie Sie die Verwendung von Karten und Kacheln optimieren, um das Benutzererlebnis und die Leistung zu verbessern. Lassen Sie uns gemeinsam dieses interessante Thema erkunden!

Frageninhalt

Ich benötige eine Schnittstellenzuordnung, weil ich in der Lage sein möchte, eine Funktion auszuführen, die eine konkrete Implementierung einer der beiden Schnittstellen verwenden kann, ohne mich um die „zusätzlichen“ Dinge zu kümmern, die diese Strukturen tun können.

Ich habe https://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go gelesen und es enthält eine gute Erklärung von Zeigern und Schnittstellen, aber ich weiß immer noch nicht, wie ich es in der Praxis umsetzen soll Dinge.

Ich versuche den folgenden Code:

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())
    }

}

Ausgabe:

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]

Was ich wirklich möchte, ist, dass sich Element eins in der Taste „eins“ befindet.

Ich denke, das Problem liegt an der Verwendung von Anführungszeichen foo[c.name] = &c 进行的分配。我需要这个,因为否则我会收到错误“cannot use c (concrete 类型的变量) 作为赋值中的 iexample 值:concrete 未实现 iexample(方法 getname 有指针接收器)

Nachdem ich https://dusted.codes/using-go-generics-to-pass-struct-slices-for-interface-slices gelesen habe, möchte ich wissen, ob ich Generika verwenden kann, um das Problem zu lösen, aber ich komme nicht darauf wie es geht .

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

Wie sorge ich dafür, dass diese Karte die richtigen Elemente enthält?

Lösung

Was Sie gemacht haben, ist richtig. Du hast einfach das Falsche in die Karte eingefügt:

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

Schleifenvariablen werden bei jeder Iteration überschrieben. Wenn Sie also die Adresse von &c 添加到映射和切片时,您添加的指针就是 c festlegen, wird diese Adresse bei jeder Iteration überschrieben.

Das obige ist der detaillierte Inhalt vonGo: So verwenden Sie Schnittstellen in Karten und Slices. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen