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

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

PHPz
PHPzavant
2024-02-10 20:57:081227parcourir

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

}

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]

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

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer