Статическая локальная переменная в Go
Можно ли определить локальную переменную в Go, которая может поддерживать свое значение от одного вызова функции к другому? В C мы можем сделать это, используя зарезервированное слово static
.
Пример на C:
int func() {
static int x = 0;
x++;
return x;
}
Ответы
Ответ 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())
}