Saya cuba meneroka sistem jenis Go dan berseronok menulis projek sampingan kecil, tetapi akhirnya menghadapi situasi yang pelik.
Apabila interface
可以采用一个类型(其中将其用于函数)时,一个 struct
实现该 interface
,该 interface
包含在 interface
berada dalam peta, saya tidak boleh menukarnya kembali kepada pelaksanaan apabila mendapatkannya semula. kenapa? bagaimana? apa salahnya
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 }
Bagaimana cara menggunakan ImpltProcFuncs
作为变量返回以获取 Data
?
Apa yang saya terlepas?
Saya rasa Go mampu memulangkan apa sahaja daripada interface
.
Nah, selepas menggali lebih dalam, anda boleh menggunakan ChatGPT melalui Bing terima kasih...
if impl, ok := (*getback).(*ImpltProcFuncs); ok { fmt.Println("working", impl.Data) } else { fmt.Println("not working") }
Apabila dilaksanakan, ia mengeluarkan "working get me back!!!!"
Atas ialah kandungan terperinci Mengapakah Go tidak boleh menghantar antara muka yang melaksanakan generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!