Heim > Artikel > Backend-Entwicklung > Warum kann Go keine Schnittstellen umwandeln, die Generika implementieren?
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.
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!