Maison > développement back-end > Golang > Aller : Comment utiliser les interfaces dans les cartes et les tranches

Aller : Comment utiliser les interfaces dans les cartes et les tranches

PHPz
Libérer: 2024-02-10 20:57:08
avant
1277 Les gens l'ont consulté

Aller : Comment utiliser les interfaces dans les cartes et les tranches

L'éditeur PHP Apple vous présentera comment utiliser les interfaces dans les cartes et le découpage. Dans le développement Web moderne, les cartes et le découpage sont des exigences fonctionnelles courantes. L'utilisation d'interfaces peut rendre les opérations sur les cartes et les tuiles plus flexibles et évolutives. Cet article expliquera en détail le concept d'interfaces et comment utiliser les interfaces pour implémenter diverses fonctions dans les cartes et les tuiles. En lisant cet article, vous apprendrez comment optimiser l'utilisation des cartes et des tuiles pour améliorer l'expérience utilisateur et les performances. Explorons ensemble ce sujet intéressant !

Contenu de la question

J'ai besoin d'une carte d'interface parce que je veux pouvoir exécuter une fonction qui peut utiliser une implémentation concrète de l'une ou l'autre interface, sans me soucier des choses "supplémentaires" que ces structures peuvent faire.

J'ai lu https://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go et il contient une bonne explication des pointeurs et des interfaces mais je ne sais toujours pas comment le faire en pratique. des choses.

J'essaie le code suivant :

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

}
Copier après la connexion

Sortie :

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]
Copier après la connexion

Ce que je veux vraiment, c'est que l'élément un soit dans la clé "un".

Je pense que le problème est dû à l'utilisation de guillemets foo[c.name] = &c 进行的分配。我需要这个,因为否则我会收到错误“cannot use c (concrete 类型的变量) 作为赋值中的 iexample 值:concrete 未实现 iexample(方法 getname 有指针接收器)"

Après avoir lu https://dusted.codes/using-go-generics-to-pass-struct-slices-for-interface-slices, je veux savoir si je peux utiliser des génériques pour résoudre le problème mais je n'arrive pas à comprendre comment faire .

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
Copier après la connexion

Comment faire en sorte que cette carte contienne les bons éléments ?

Solution

Ce que vous avez fait est correct. Vous venez de mettre la mauvaise chose sur la carte :

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

Les variables de boucle sont écrasées à chaque itération, donc lorsque vous définissez l'adresse de &c 添加到映射和切片时,您添加的指针就是 c , cette adresse est écrasée à chaque itération.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal