Без цикла 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 .