gpt4 book ai didi

go - 如何返回指定返回值的子类型(在本例中为 interface{})?

转载 作者:IT王子 更新时间:2023-10-29 02:32:39 24 4
gpt4 key购买 nike

我有一个接口(interface),它定义了一个类型为 func(interface{}, proto.Message) interface{} 的参数,我正在尝试传递类型为 func reduceMsg( a interface{}, b proto.Message) []*PersistentData 给它。这会导致以下编译器错误:

Cannot use reduceMsg (type func(a interface{}, b proto.Message) []*PersistentData as type func(interface{}, proto.Message) interface{}

此错误的原因是什么,我该如何解决?似乎返回比 interface{} 更具体的类型应该是合法的。这是一个说明问题的简单完整示例:

package main

import "fmt"

func main() {
var t func() interface{} = func() []string { return []string{} }
fmt.Println(t)
}

最佳答案

对象的类型是整个函数的签名。如果签名不匹配,则它不是同一类型,不能以这种方式分配。

任何东西都可以分配给空接口(interface),因为所有类型都满足该接口(interface),但在您的问题中,两种类型都不是空接口(interface),您只有一个返回空接口(interface)的函数。

不是因为函数的一部分可以分配给另一部分,所以它是一样的。类型是整个函数签名。我认为这与无法将 int 分配给 int8 背后的逻辑相同。如果需要,您可以强制转换它们,但就 go 而言,它们是不同的类型,您需要处理进行必要的转换才能分配它们。

您可以做的是更改您的第二个函数签名以返回一个空接口(interface),如下所示:

func(interface{}, proto.Message) interface{}

func reduceMsg(a interface{}, b proto.Message) interface{} {
var a []*PersistentData
// do something here
return a
}

这样函数签名是相同的,所以它被认为是相同的类型并且您返回一个 []*PersistentData。当然,在使用它之前,您需要进行类型断言,因为程序会将其视为一个{}接口(interface),因为这是函数返回的类型。

关于go - 如何返回指定返回值的子类型(在本例中为 interface{})?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43623049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com