当前位置: 首页 > 面试题库 >

我为什么不能在go中传递`func()[] int`作为`func()[] interface {}`?

柴深
2023-03-14
问题内容

我有以下定义:

func (c *Collector) RegisterSource(f func() []interface{}) {
    c.source = f
}

我尝试按如下方式调用它,但收到错误消息:

func source() []int {
    return []int{ 0, 1, 2, 3, 4 }
}
...
c.RegisterSource(source)

这符合:

cannot use source (type func() []int) as type func() []interface {} in argument to c.RegisterSource

问题答案:

该相关转到FAQ中指出,[]T[]interface{}«别在内存相同的表示»。

要了解原因,让我们剖析两件事:

  1. 切片是一个后备存储阵列,外加几个包含切片大小和容量的整数。

在Go中,数组并不是某种意义上的“高级”。相反,它们包含的元素的布局是严格定义的:它们全部包含在内存的相邻区域中,彼此相邻。

这意味着,在切片的支持数组中[]T,元素是类型的T,并且每个元素都占据该类型自然大小的内存区域T,并且所有这些区域在单个连续的内存块中都彼此相邻。

这意味着,片的每个元素[]int在64位平台上恰好占用64位(8字节),即单个int值占用的内存量。

  1. 任何接口类型的值(包括空接口 interface{})都表示为包含两个指针的结构,如下所示:
    type iface struct {
    realType  *typeInfo
    realValue *dataType
    

    }

(有关接口表示方式的更多信息- 此处)。

以上所有方法均意味着一个[]interface{}元素中的每个元素在内存区域中占据两个指针的大小,并且这两个指针包含内存中其他变量的地址-
与元素仅包含的整数值相反[]int

反过来,这意味着您不能仅仅“投射” []int到“
[]interface{}—”仅是因为[]intint)的任何元素中存储的值在其结构(内存布局)中与[]interface{}(一个包含两个指针的结构)不兼容。)。为了彼此产生,您需要分配一个切片并将源切片的每个html" target="_blank">元素转换为目标切片的匹配元素。

最后,这意味着如果一个函数返回一个type的slice
[]int,则该代码不能由期望该类型的slice的代码直接处理[]interface{}(反之亦然),这解释了为什么问题中的两个函数签名表示不兼容的类型。



 类似资料:
  • 当然,现在只能检测带有0个参数的函数。为什么在使用时正确选择了专门化,而不是?

  • 描述 (Description) C库函数int atexit(void (*func)(void))导致在程序终止时调用指定的函数func 。 您可以在任何地方注册终止功能,但会在程序终止时调用它。 声明 (Declaration) 以下是atexit()函数的声明。 int atexit(void (*func)(void)) 参数 (Parameters) func - 这是在程序终止时调

  • 描述 (Description) C库函数void (*signal(int sig, void (*func)(int)))(int)设置处理信号的函数,即信号编号为sig的信号处理程序。 声明 (Declaration) 以下是signal()函数的声明。 void (*signal(int sig, void (*func)(int)))(int) 参数 (Parameters) sig

  • 问题内容: ./chains.go:26:10:不能在作业中使用UpperCaseHandler(typefunc(asl.MessageDelivery))作为asl.MessageHandler类型./chains.go:37:86:无法使用RepeatHandler(类型func(asl.MessageDelivery))与Repeater.ConsumeFunc的参数中的asl.Messa

  • 函数柯里化。 参数 名称 类型 默认值 描述 func Function 回调函数。

  • 描述 (Description) 方法sort()对列表的对象进行排序,如果给定则使用compare func 。 语法 (Syntax) 以下是sort()方法的语法 - list.sort([func]) 参数 (Parameters) NA 返回值 (Return Value) 此方法不返回任何值,但它从原始列表更改。 例子 (Example) 以下示例显示了sort()方法的用法。 #!