返回顶部
首页 > 资讯 > 精选 >为什么 Go 不能强制转换实现泛型的接口?
  • 271
分享到

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

2024-02-05 22:02:43 271人浏览 薄情痞子
摘要

问题内容 我正在尝试探索 Go 的类型系统,并在编写一个小型副项目时获得乐趣,但最终遇到了一个奇怪的情况。 当一个 interface 可以采用一个类型(其中将其用于函数)时,一个 s

问题内容

我正在尝试探索 Go 的类型系统,并在编写一个小型副项目时获得乐趣,但最终遇到了一个奇怪的情况。

当一个 interface 可以采用一个类型(其中将其用于函数)时,一个 struct 实现该 interface ,该 interface 包含在 interface 的映射中,检索时我无法将其转换回实现。为什么?如何?怎么了?

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
}

如何将 ImpltProcFuncs 作为变量返回以获取 Data

我错过了什么?

我认为 Go 能够从 interface 返回任何内容。


正确答案


好吧,在深入研究之后,您可以通过 Bing 感谢 ChatGPT...

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

执行时,它输出“working get me back!!!!”

以上就是为什么 Go 不能强制转换实现泛型的接口?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 为什么 Go 不能强制转换实现泛型的接口?

本文链接: https://lsjlt.com/news/561077.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 为什么 Go 不能强制转换实现泛型的接口?
    问题内容 我正在尝试探索 Go 的类型系统,并在编写一个小型副项目时获得乐趣,但最终遇到了一个奇怪的情况。 当一个 interface 可以采用一个类型(其中将其用于函数)时,一个 s...
    99+
    2024-02-05
  • java为什么不能实现真正泛型
    Java 之所以不能实现真正泛型的原因有以下几点:1. Java泛型是通过类型擦除来实现的,即在编译期间将泛型类型擦除为其上界或Ob...
    99+
    2023-09-20
    java
  • python强制类型转换怎么实现
    在Python中,可以使用内置的几个函数来实现强制类型转换,具体取决于要转换的数据类型。以下是一些常用的类型转换函数:1. int(...
    99+
    2023-10-19
    python
  • php怎么实现强制类型转换
    这篇文章主要介绍“php怎么实现强制类型转换”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php怎么实现强制类型转换”文章能帮助大家解决问题。强制转换方法:1、在要转换的变量前加上用括号括起来的目标...
    99+
    2023-06-30
  • java怎么实现强制类型转换
    在Java中,强制类型转换可以通过将目标类型放在圆括号中并将其放在要转换的表达式之前来实现。例如,将一个整数转换为一个双精度浮点数可...
    99+
    2024-04-02
  • go结构体强制类型转换的方法是什么
    在Go语言中,结构体之间的强制类型转换需要使用类型断言。类型断言的语法如下:```govalue, ok := expression...
    99+
    2023-08-08
    go
  • 利用golang怎么实现一个强制类型转换功能
    这篇文章给大家介绍利用golang怎么实现一个强制类型转换功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。golang的优点有哪些golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到...
    99+
    2023-06-06
  • go为什么不支持隐式类型转换
    go不支持隐式类型转换是因为它会降低代码可读性和可维护性、增加潜在的错误风险、破坏语言的一致性和简洁性、鼓励明确的类型转换和显式的编程风格等。详细介绍:1、降低代码可读性和可维护性,隐式类型转换在代码中往往不清晰,难以阅读和理解,当程序员在...
    99+
    2023-11-10
    隐式类型转换 Go
  • golang强制类型转换的语法是什么
    本篇内容主要讲解“golang强制类型转换的语法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“golang强制类型转换的语法是什么”吧!一、强制类型转换的概念强制类型转换也称为显式类型转换...
    99+
    2023-07-06
  • C语言隐式类型转换与强制类型转换的方法是什么
    本篇内容主要讲解“C语言隐式类型转换与强制类型转换的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言隐式类型转换与强制类型转换的方法是什么”吧!类型转换数据有不同的类型,不同类型数...
    99+
    2023-06-25
  • 如何将接口转换为它实现的另一个接口?
    php小编草莓将为大家介绍如何将接口转换为它实现的另一个接口。在编程中,接口是一种定义了一组方法的抽象类型,而另一个接口则是实现了这些方法的具体类型。将接口转换为另一个接口可以帮助我们...
    99+
    2024-02-13
  • 实战演练:Go语言中的数据类型强制转换技巧
    Go语言中的数据类型强制转换一直是开发者们需要面对的一个重要问题。虽然Go语言是一门静态类型语言,但在实际开发中,我们经常会遇到需要进行数据类型转换的情况。本文将通过具体的代码示例,探...
    99+
    2024-04-02
  • C#泛型接口的协变和逆变怎么实现
    本文小编为大家详细介绍“C#泛型接口的协变和逆变怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#泛型接口的协变和逆变怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、什么是协变、逆变?假设:T...
    99+
    2023-06-29
  • C#快速实现IList非泛型类接口的自定义类作为数据源
    目录一、利用VS的修补程序快速继承IList二、实现必须的成员使用可以绑定数据源的控件我们需要有实现了IList接口的类作为数据源,我们有很多的方法,比如使用ArrayList或者L...
    99+
    2023-02-06
    C# IList数据源
  • 在 golang 中,实现自定义类型的方法,因此不需要在 Println 中进行强制转换
    小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《在 golang 中,实现自定义类型的方法,因此不需要在 Println 中进行强制转换》,以下内容将会涉及到,若是在学习...
    99+
    2024-04-04
  • C++怎么实现将s16le的音频流转换为float类型
    本文小编为大家详细介绍“C++怎么实现将s16le的音频流转换为float类型”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现将s16le的音频流转换为float类型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-06
  • 为什么 Go 函数不能返回带有约束类型参数的类型?
    为什么Go函数不能返回带有约束类型参数的类型?这是一个经常引发疑惑的问题。在Go语言中,函数的返回类型不能是带有约束类型参数的类型,这主要是由于Go语言对泛型的支持较为有限所导致的。在...
    99+
    2024-02-09
    go语言
  • 为什么Go Channel的缓冲区不能正确限制写入/读取?
    php小编柚子在这篇文章中将解答一个常见问题:“为什么Go Channel的缓冲区不能正确限制写入/读取?”在Go语言中,Channel是一种用于协程之间通信的机制。当我们使用带有缓冲...
    99+
    2024-02-09
    go语言
  • Spring rest接口中的LocalDateTime日期类型转时间戳怎么实现
    这篇“Spring rest接口中的LocalDateTime日期类型转时间戳怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我...
    99+
    2023-07-05
  • go语言转发功能的实现和应用场景是什么
    本篇内容介绍了“go语言转发功能的实现和应用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、golang的优势在传统的web应用...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作