Maison  >  Article  >  développement back-end  >  Implémentation de méthodes d'interface utilisant des structures de types génériques dans Go

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

WBOY
WBOYavant
2024-02-06 08:20:04428parcourir

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

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

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

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

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

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!

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