使用接口在非空数组(切片)中查找另一个“特殊”数组

Posted

技术标签:

【中文标题】使用接口在非空数组(切片)中查找另一个“特殊”数组【英文标题】:Find an another "special" array in a non-empty array (slice) using interface 【发布时间】:2021-06-02 11:04:24 【问题描述】:

我想写一个函数,它接受一个“特殊”数组并在 Golang 中返回其乘积和。(嵌套越多,乘数增加 1)

这是使用接口的解决方案之一,但我不确定为什么此代码有效。我理解一般逻辑,但不确定为什么“接口”可以区分当前元素是否是一种“特殊”数组。 (包含切片)。

由于我们传递了一个类型为 SpecialArray 接口的数组,所有范围内的元素都可能是 SpecialArray 类型,所以看起来没有机会进入 else 语句。 Golang 中是否有类似内置“SpecialArray”接口的东西?

这里是输入值和输出的例子。array = [5, 2, [7, -1], 3, [6, [-13, 8], 4]] => output = 12 // 5 + 2 + 2 *( 7 -1) +3 + 2 * (6 + 3 * (-13 +8) + 4)

package main

type SpecialArray []interface

func ProductSum(array []interface) int 
    return helper(array, 1)


func helper(array SpecialArray, multiplier int) int 
    sum := 0
    // loop passed array
    for _, element := range array 
        if cast, ok := element.(SpecialArray); ok 
            sum += helper(cast, multiplier + 1)
         else if cast, ok := element.(int); ok 
            sum += cast
        
    
    return sum * multiplier




【问题讨论】:

【参考方案1】:
for _, element := range array 

从正在考虑的元素中获取单个元素

if cast, ok := element.(SpecialArray); ok 

这意味着如果当前元素是“SpecialArray”(或 [] 接口),则执行某些操作 - 即递归调用辅助函数

 else if cast, ok := element.(int); ok 

这意味着数组已经得到了数组中的整数,所以可以将它们相加

请参阅 Go 语言规范中的 https://golang.org/ref/spec#Type_assertions

【讨论】:

以上是关于使用接口在非空数组(切片)中查找另一个“特殊”数组的主要内容,如果未能解决你的问题,请参考以下文章

MaxDoubleSliceSum 算法

用另一个数组切片 numpy 数组

最小切片位置 - 阶 N 算法

如何在JavaScript / Jquery中对另一个数组中已经存在的数组元素进行切片[重复]

创建数组的随机切片以分配给另一个对象数组

Java 8 Stream 流 - 使用