当前位置: 首页 > 知识库问答 >
问题:

golang中是否有任何函数会发现值是否在数组中?

岳英耀
2023-03-14

假设有一个切片中有整数。我们声明了一个包含整数值的变量,然后我必须在不使用for循环的情况下从该切片中找到值。

使用for循环时,我会这样做:-

package main

import (
   "fmt"
)

func main() {
  value := 10
  var interf []interface{}
  for i := 1; i <= value; i++{
    interf = append(interf, i)
  } 
  fmt.Println(interf)
  for _,v := range interf{
    if value == v{
       fmt.Println("Matched")
    }
  }
}

我们如何在不使用for循环的情况下做同样的事情

共有1个答案

宰坚
2023-03-14

如果没有for循环,则没有*(请参见如何在golang切片中搜索元素),但是。。。对于循环,您有什么反对意见?为什么你不能用循环来做这个?这个问题就像“我能不用编码就完成吗”?

*实际上,您可以使用递归函数而不使用for循环,但这只适用于教育目的,对于实际目的毫无价值。见答案末尾的解决方案。

标准库中没有现成的函数,但这就是自己创建函数的简单程度:

func find(what interface{}, where []interface{}) (idx int) {
    for i, v := range where {
        if v == what {
            return i
        }
    }
    return -1
}

使用它:

what := 10
where := []interface{}{1, 2, 3, 10, 5}
fmt.Println(find(what, where))

输出(在运动场上尝试):

3

还要注意,使用[]int切片类型而不是[]接口{}会更快、更方便:

func find(what int, where []int) (idx int) {
    for i, v := range where {
        if v == what {
            return i
        }
    }
    return -1
}

然后使用它:

what := 10
where := []int{1, 2, 3, 10, 5}
fmt.Println(find(what, where))

输出是一样的。在围棋游乐场试试这个。

您可以创建一个函数,该函数使用接口{}类型接受任何类型的片,但这需要反射来实现它,这将较慢,不值得使用。相反,如果需要,只需创建一个具有具体切片类型的函数,或者只需使用for循环。

为了完整起见,这里的解决方案不使用html" target="_blank">循环,而是使用递归函数。此处仅用于教育目的,上述解决方案优于此:

func find(what int, where []int) (idx int) {
    if len(where) == 0 {
        return -1
    }
    if what == where[0] {
        return 0
    }
    if idx = find(what, where[1:]); idx < 0 {
        return -1 // Not found in the rest of the slice
    }
    return 1 + idx
}

在运动场上试试这个。

 类似资料:
  • 问题内容: 如果我这样做: 在那个func里面引用foo是错误的吗? 问题答案: 很好,只有在上下文变化时才需要注意(在局部指针变量的情况下): 还请参见:https : //www.goinggo.net/2014/06/pitfalls-with-closures-in- go.html

  • 问题内容: 我想知道是否可以在Go中为未知数量的变量定义函数。 像这样 我想对任意数量的输入进行泛化。 问题答案: 据我所知,您已经了解了很多,但是语法是。见规格: 给定功能并调用 在Greeting中,将具有价值

  • 但这涉及到寻找一个具有最大和的子数组,而不是已经给出的和。 我怎样才能有效地找到这个?这里可以用动态规划吗?请帮帮我。

  • 问题内容: 我想知道它是否是反模式,或者是否以某种方式影响组件,例如: 问题答案: 我认为一般来说,人们避免在render中定义函数,但是根据这篇博客文章,这并不是一个坏习惯。该博客文章重点介绍了在render中定义的内联事件处理函数,但我想它适用于render中定义的任何函数。在渲染器中定义函数意味着每次调用渲染器时都要重新定义它们的开销,但这可能不会因组件而导致明显的性能差异。 对于您给出的特

  • 问题内容: 我有一个名为“ bob”的数组,其中包含值。 我如何才能知道在没有迭代的情况下名为bob的数组中是否存在“傻”值? 问题答案: 您可以使用方法。为此,您需要将数组转换为列表。您可以使用以下方法:

  • 问题内容: 如何检查是否具有或的值? 问题答案: 使用? 顺便说一句,您要为键分配一个值两次,因此您的数组将导致一个只有一个值的数组。