Подтвердить что ты не робот

Статическая локальная переменная в Go

Можно ли определить локальную переменную в Go, которая может поддерживать свое значение от одного вызова функции к другому? В C мы можем сделать это, используя зарезервированное слово static.

Пример на C:

int func() {
    static int x = 0; 
    x++;
    return x;
}
4b9b3361

Ответ 1

Используйте закрытие:

Функциональные литералы - это замыкания: они могут ссылаться на переменные, определенные в окружающая функция. Затем эти переменные распределяются между окружающая функция и функция literal, и они выживают как поскольку они доступны.

Он не должен находиться в глобальной области, как раз за пределами определения функции.

func main() {

    x := 1

    y := func() {
        fmt.Println("x:", x)
        x++
    }

    for i := 0; i < 10; i++ {
        y()
    }
}

(Пример на Перейти на площадку)

Ответ 2

Объявить var в глобальной области:

var i = 1

func a() {
  println(i)
  i++
}

Ответ 3

Вы можете сделать что-то вроде этого

package main

import (
    "fmt"
)

func main() {
  f := do()
  f() // 1
  f() // 2
}

func do() (f func()){
  var i int
  f = func(){
    i++
    fmt.Println(i)
  }
  return
}

Ссылка на игровую площадку https://play.golang.org/p/D9mv9_qKmN

Ответ 4

Как и в случае с предложением Taric, но с staticCounter(), возвращающим функцию int

package main

import (
    "fmt"
)

func staticCounter() (f func()(int)){
  var i int
  f = func()(int){
    i++
//  fmt.Println(i)
    return i
  }
  return
}

func main() {
  f := staticCounter()
  g := staticCounter()
  fmt.Println(f())
  fmt.Println(f())
  fmt.Println(f())
  fmt.Println(f())
  fmt.Println(g())
  fmt.Println(g())
}