"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué no puedo usar una variable de tipo `*t` como una` stringer 'en GO Genics?

¿Por qué no puedo usar una variable de tipo `*t` como una` stringer 'en GO Genics?

Publicado el 2025-03-24
Navegar:658

Why Can't I Use a `*T` Type Variable as a `Stringer` in Go Generics?

que no puede usar la variable de tipo *t como tipo stringer en el argumento "Error en GO Generics

En el Spiptet de código proporcionado, está intentando invocar genéricamente una función que espera que un parámetro de tipo de tipo de tipo, pero está pasando un Pitiner a un Pantinero a un Tipo T de Tipo. Go Compiler está planteando un error porque:

    escribe identidad y parámetros:
  • t no es inherentemente equivalente a su restricción foobar. Por lo tanto, *t no es lo mismo que *foobar o *bar.
  • faltando método:
  • La interfaz Stringer requiere un método llamado A (). Actualmente, sus tipos de foo y barra implementan este método en los receptores de puntero, pero *t no posee inherentemente este método.
arreglando el problema

hay dos enfoques principales para resolver este problema:

1. Afirmar la seguridad del tipo con type aserción (menos optimal)

afirmar que *t implementa a Stringer usando cualquier (t). (Stringer) dentro de la función DO.
  • Este enfoque puede conducir a los pánico si t no implementa realmente Stringer.
  • [&]
  • 2. Redefine la restricción y personalice genéricos (preferido)

Agregue Stringer como restricción a la interfaz Foobar.

    use receptores de puntero para los tipos de Foo y bar interfaz.
  • Pase una instancia del tipo restringido como argumento a bla.
  • Código revisado:
escriba foobar [t foo | Bar] interfaz { *T larguero } func bla [t foo | barra, u foobar [t]] () { var t t hacer (u (& t)) } func Main () { bla [foo] () En este código revisado:

, la interfaz Foobar incluye a Stringer como una restricción. Restricciones.

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar[T]]() {
    var t T
    do(U(&t))
}

func main() {
    blah[foo]()
}

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3