使用接口在非空数组(切片)中查找另一个“特殊”数组
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
【讨论】:
以上是关于使用接口在非空数组(切片)中查找另一个“特殊”数组的主要内容,如果未能解决你的问题,请参考以下文章