Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Go tidak boleh menghantar antara muka yang melaksanakan generik?

Mengapakah Go tidak boleh menghantar antara muka yang melaksanakan generik?

WBOY
WBOYke hadapan
2024-02-05 21:27:03546semak imbas

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

Kandungan soalan

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.


Jawapan betul


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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam