Heim >Backend-Entwicklung >Golang >Warum kann Go keine Schnittstellen umwandeln, die Generika implementieren?

Warum kann Go keine Schnittstellen umwandeln, die Generika implementieren?

WBOY
WBOYnach vorne
2024-02-05 21:27:03614Durchsuche

为什么 Go 不能强制转换实现泛型的接口?

Frageninhalt

Ich habe versucht, das Typsystem von Go zu erkunden und Spaß daran zu haben, ein kleines Nebenprojekt zu schreiben, bin aber in eine seltsame Situation geraten.

Wenn ein interface 可以采用一个类型(其中将其用于函数)时,一个 struct 实现该 interface ,该 interface 包含在 interface in der Karte ist, kann ich es beim Abrufen nicht wieder in die Implementierung konvertieren. Warum? Wie? Was ist falsch?

package main

import (
    "context"
    "fmt"
)

type State struct {
    Data string
}

type InterfaceFuncs[T any] interface {
    Init(ctx context.Context,
        stateGetter func() T,
        stateMutator func(mutateFunc func(T) T)) error
}

type ConfigWrap[T any] struct {
    InterFuncs InterfaceFuncs[T]
}

type Controller[T any] struct {
    mapinterfaces map[string]ConfigWrap[T]
}

func New[T any](initialState T) *Controller[T] {
    return &Controller[T]{
        mapinterfaces: make(map[string]ConfigWrap[T]),
    }
}

func (c *Controller[T]) RegisterFuncs(pid string, config ConfigWrap[T]) error {
    c.mapinterfaces[pid] = config
    return nil
}

func (c *Controller[T]) InterFuncs(pid string) (*InterfaceFuncs[T], error) {

    var pp ConfigWrap[T]
    var exists bool

    if pp, exists = c.mapinterfaces[pid]; exists {
        return &pp.InterFuncs, nil
    }

    return nil, fmt.Errorf("InterFuncs not found")
}

func main() {

    ctrl := New[State](State{})

    ctrl.RegisterFuncs("something", ConfigWrap[State]{
        InterFuncs: &ImpltProcFuncs{
            Data: "get me back!!!!",
        },
    })

    // why can't we cast it back to ImpltProcFuncs
    getback, _ := ctrl.InterFuncs("something")

    // I tried to put it as interface but doesn't works either
    //// doesn't work
    switch value := any(getback).(type) {
    case ImpltProcFuncs:
        fmt.Println("working", value)
    default:
        fmt.Println("nothing")
    }

    //// doesn't work
    // tryme := any(getback).(ImpltProcFuncs) // panic: interface conversion: interface {} is *main.InterfaceFuncs[main.State], not main.ImpltProcFuncs
    // fmt.Println("please", tryme.Data)

    //// doesn't work
    // tryme := getback.(ImpltProcFuncs)

    //// doesn't work
    // switch value := getback.(type) {
    // case ImpltProcFuncs:
    //     fmt.Println("working", value)
    // }
}

type ImpltProcFuncs struct {
    Data string
}

func (p *ImpltProcFuncs) Init(
    ctx context.Context,
    stateGetter func() State,
    stateMutator func(mutateFunc func(State) State)) error {
    return nil
}

Wie benutzt man ImpltProcFuncs 作为变量返回以获取 Data?

Was habe ich verpasst?

Ich denke, Go ist in der Lage, alles von interface zurückzugeben.


Richtige Antwort


Nun, nachdem Sie tiefer gegraben haben, können Sie dank ChatGPT Bing verwenden...

if impl, ok := (*getback).(*ImpltProcFuncs); ok {
        fmt.Println("working", impl.Data)
    } else {
        fmt.Println("not working")
    }

Bei der Ausführung wird „Arbeitet, hol mich zurück!!!!“ ausgegeben

Das obige ist der detaillierte Inhalt vonWarum kann Go keine Schnittstellen umwandeln, die Generika implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen