英文:
Static local variable in Go
问题
在Go语言中,可以使用var
关键字定义一个局部变量,但是它的值在函数调用之间是不会保持的。Go语言中没有类似C语言中的static
关键字来实现这种功能。如果你想要在函数调用之间保持变量的值,可以考虑使用全局变量或者将变量作为函数的参数传递。
英文:
Is it possible to define a local variable in Go that can maintain its value from one function call to another? In C, we can do this using the reserved word static
.
Example in C:
<!-- language: c -->
int func() {
static int x = 0;
x++;
return x;
}
答案1
得分: 38
使用闭包:
函数字面量是闭包:它们可以引用在周围函数中定义的变量。这些变量在周围函数和函数字面量之间共享,并且只要它们可访问,它们就会一直存在。
它不必在全局范围内,只需在函数定义之外。
func main() {
x := 1
y := func() {
fmt.Println("x:", x)
x++
}
for i := 0; i < 10; i++ {
y()
}
}
(在 Go Playground 上的示例)
英文:
Use a closure:
> Function literals are closures: they may refer to variables defined in
> a surrounding function. Those variables are then shared between the
> surrounding function and the function literal, and they survive as
> long as they are accessible.
It doesn't have to be in global scope, just outside the function definition.
func main() {
x := 1
y := func() {
fmt.Println("x:", x)
x++
}
for i := 0; i < 10; i++ {
y()
}
}
(Sample on the Go Playground)
答案2
得分: 23
你可以这样做
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
}
Playground链接:https://play.golang.org/p/D9mv9_qKmN
英文:
You can do something like this
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
}
Link on Playground https://play.golang.org/p/D9mv9_qKmN
答案3
得分: 20
在全局范围声明一个变量:
var i = 1
func a() {
println(i)
i++
}
英文:
Declare a var at global scope:
var i = 1
func a() {
println(i)
i++
}
答案4
得分: 3
像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())
}
英文:
Like Taric' suggestion, but with staticCounter() returning an int function
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())
}
答案5
得分: 3
在以下示例中,变量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
英文:
In following example, variable sum behaves like a separate static for each closure a1 and 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),
)
}
}
Output
0 0
1 -1
3 -3
6 -6
10 -10
15 -15
21 -21
28 -28
36 -36
45 -45
答案6
得分: 1
在所有其他答案中,包含静态变量的函数是在主函数中赋值的。
以下是如何在全局范围内定义和赋值该函数的方法。
var myFunction = func() func(type1, type2) type3 {
myStaticVariable := []string {"hello", "world"}
return func(arg1 type1, arg2 type2) type3 {
// 在这里使用 arg1、arg2 和 myStaticVariable
}
}()
英文:
In all the other answers, the function containing a static variable is assigned in the main.
Here is how you can define and assign that function in the global scope.
var myFunction = func() func(type1, type2) type3 {
myStaticVariable := []string {"hello", "world"}
return func(arg1 type1, arg2 type2) type3 {
// use arg1, arg2 and myStaticVariable here
}
}()
答案7
得分: 0
// 一个变量x1是局部变量,不是全局变量。
// 静态变量是不能从其他函数中访问的,就像全局变量一样。
// 静态变量在函数结束时不会消失。
// 这个程序中的x1和x2就是这样假装的。
包 main
import (
"fmt"
)
/*
int func() { // 函数内的静态变量x。
static int x = 0;
x++;
return x;
}
*/
//
func main() {
//
var x1 int = 0
var x2 int = 100
//
for i := 0; i < 10; i++ { // 调用一个“静态”变量x
x1 = fun1(&x1)
x2 = fun2(&x2)
fmt.Printf("%d %d \n", x1, x2)
} //
test1(x1, x2) // 一个函数需要参数来看到x1和x2
} //main
//
func fun1(p *int) int {
//
*p++ // 保存值
return *p // 计数器x1
}
//
func fun2(p *int) int {
*p++ // 保存值
return *p // 计数器x2
}
//
func test1(x1 int, x2 int) {
fmt.Println(""x1" 和 "x2" ", x1, x2)
}
英文:
// A var x1 is local to main(), is not a global var.
// A static var is one that can't be accesed from others functions just
// like global vars.
// A static var dont disappears when the function ends.
// So is what x1 n x2 are pretending in this program.
package main
import (
"fmt"
)
/*
int func() { // x static inside a function.
static int x = 0;
x++;
return x;
}
*/
//
func main() {
//
var x1 int = 0
var x2 int = 100
//
for i := 0; i < 10; i++ { // call to a "static" var x
x1 = fun1(&x1)
x2 = fun2(&x2)
fmt.Printf("%d %d \n", x1, x2)
} //
test1(x1, x2) // a funct needs parameters to see x1 n x2
} //main
//
func fun1(p *int) int {
//
*p++ // save value
return *p //counter x1
}
//
func fun2(p *int) int {
*p++ // save value
return *p //counter x2
}
//
func test1(x1 int, x2 int) {
fmt.Println("\"x1\" y \"x2\" ", x1, x2)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论