【问题标题】: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
}



【问题讨论】:

    标签: arrays go recursion


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 2012-11-19
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 2021-07-10
      相关资源
      最近更新 更多