Позволяет ли Go фиксировать вызов функции в анонимной функции только один раз?

# #go

Вопрос:

Чтобы сделать мой вопрос более точным, я собираюсь представить фрагмент кода на C :

 int findSomething(const std::vectorlt;intgt;amp; v, int val) {  auto it = std::find(v.begin(), v.end(), val);  return it == v.end() ? 0 : *it; }  bool useAsSomething(int val) {  return val != val; }  int main() {  std::vectorlt;intgt; vec = {1, 2, 3, 4, 5, 6};   auto lambda = [val = findSomething(vec, 5)] { // findSomething is invoked only once  return useAsSomething(val);  };   std::cout lt;lt; lambda(); }  

Я хотел бы сделать то же самое с Go:

 vec = filterVec(vec, func(val int) bool {  return useAsSomething(findSomething(vec))  })  

В этом случае findSomething вызывается столько, сколько, len(vec) но я не хочу повторять вызов. Можно ли вызвать findSomething только один раз без объявления переменной снаружи с последующим захватом?

Ответ №1:

В Go нет явного синтаксиса захвата. Вы должны объявить предварительно вычисленную переменную снаружи, тогда она может быть захвачена неявно.

 x := findSomething(vec) vec = filterVec(vec, func(val int) bool {  return useAsSomething(x, val) })