是否可以在Go中定义一个可以将其值从一个函数调用维护到另一个函数的局部变量?在C中,我们可以使用保留字static
来完成此操作。
C:
中的示例int func() {
static int x = 0;
x++;
return x;
}
答案 0 :(得分:23)
使用closure:
函数文字是闭包:它们可以引用在中定义的变量 周围的功能。然后在这些变量之间共享这些变量 周围函数和函数文字,它们存活下来 只要他们可以访问。
它不必位于全局范围内,就在函数定义之外。
func main() {
x := 1
y := func() {
fmt.Println("x:", x)
x++
}
for i := 0; i < 10; i++ {
y()
}
}
(Go Playground上的示例)
答案 1 :(得分:11)
在全局范围内声明var:
var i = 1
func a() {
println(i)
i++
}
答案 2 :(得分:5)
你可以做这样的事情
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
}
答案 3 :(得分:1)
就像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())
}
答案 4 :(得分:1)
在下面的示例中,变量sum的行为类似于每个闭包a1和a2的单独静态变量。
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
a1,a2 := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
a1(i),
a2(-1*i),
)
}
}
输出
0 0
1 -1
3 -3
6 -6
10 -10
15 -15
21 -21
28 -28
36 -36
45 -45
答案 5 :(得分:0)
conda create -n PDSH python=3.5 --file requirements.txt