Есть ли в golang функция, которая найдет значение в массиве или нет? - PullRequest
0 голосов
/ 24 октября 2018

Предположим, есть срез с целыми числами.И мы объявили переменную, которая содержит целочисленное значение, тогда я должен найти значение из этого среза, не используя цикл 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 Ответ

0 голосов
/ 24 октября 2018

Без цикла for, нет * (см. Как искать элемент в срезе golang ), но ... что вы имеете против forпетли?Почему вы не можете использовать петли для этого?Этот вопрос похож на «могу ли я сделать это без кодирования» ?

* На самом деле вы могли бы сделать это без цикла 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))

Вывод (попробуйте на Go Playground ):

3

Также обратите внимание, что это будет быстрее и удобнееиспользуйте []int тип среза вместо []interface{}:

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))

Вывод такой же.Попробуйте это на Go Playground .

. Вы можете создать функцию, которая принимает срезы любого типа, используя тип interface{}, но для ее реализации потребуется отражение, которое будетмедленнее и не достоин использования.Вместо этого просто создайте функцию с конкретными типами срезов, если вам нужно, или просто используйте цикл for.

Для полноты, вот решение, которое использует не циклы for, а рекурсивную функцию.Это здесь только для образовательных целей, выше решения выше этого:

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
}

Попробуйте это на Go Playground .

...