Maison > développement back-end > Golang > le corps du texte

Implémentation de méthodes d'interface utilisant des structures de types génériques dans Go

WBOY
Libérer: 2024-02-06 08:20:04
avant
474 Les gens l'ont consulté

在 Go 中使用泛型类型结构实现接口方法

Contenu de la question

Je veux une interface qui peut transmettre des paramètres de n'importe quel type à sa méthode unique, et je veux une structure d'implémentation unique avec des génériques.

Voici une version super simplifiée de mon problème :

package main

type MyInterface interface {
    Set(val any)
}

type MyStruct[T any] struct {
    val T
}

func NewMyStruct[T any]() *MyStruct[T] {
    return &MyStruct[T]{}
}

func (s *MyStruct[T]) Set(val T) {
    s.val = val
}

func main() {
    var obj MyInterface
    obj = NewMyStruct[any]() // accepted
    obj = NewMyStruct[int]() // not accepted
    obj = NewMyStruct[string]() // not accepted
}
Copier après la connexion

Existe-t-il un moyen de satisfaire les exigences du compilateur sans perdre les informations de type de la méthode Set lorsque l'on traite directement la structure ?


Bonne réponse


Code

Je pense que votre code peut être modifié comme ça

package main

import "fmt"

type MyInterface[T any] interface {
    Set(value T)
}

type MyStruct[T any] struct {
    val T
}

func NewMyStruct[T any]() *MyStruct[T] {
    return &MyStruct[T]{}
}

func (s *MyStruct[T]) Set(val T) {
    s.val = val
}

func main() {
    var obj1 MyInterface[int]
    obj1 = NewMyStruct[int]()

    var obj2 MyInterface[string]
    obj2 = NewMyStruct[string]()

    var obj3 MyInterface[any]
    obj3 = NewMyStruct[any]()
}
Copier après la connexion

Instructions

Chaque fois que vous utilisez un type paramétré, vous devez remplacer les paramètres de type dans sa définition par le type réel. Cela signifie que le type générique dans l'interface doit être instancié. Pour cela, votre interface doit être déclarée ainsi.

// As-is
type MyInterface interface {
    Set(val any)
}
// To-be
type MyInterface[T any] interface {
    Set(val T)
}
Copier après la connexion

Et lorsque vous l'utilisez, vous devez savoir clairement quel type any vous utilisez.

func main() {
    var obj1 MyInterface[int]
    obj1 = NewMyStruct[int]()
}
Copier après la connexion

J'ai cité deux pages

[1] Erreur Go : impossible d'utiliser des types génériques non instanciés

[2] Comment implémenter une interface universelle ?

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!

Étiquettes associées:
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