Go语言中的静态局部变量

huangapple go评论86阅读模式
英文:

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(&quot;x:&quot;, x)
		x++
	}

	for i := 0; i &lt; 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 (
	&quot;fmt&quot;
)

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 (
    &quot;fmt&quot;
)

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
英文:

Use Function closure

In following example, variable sum behaves like a separate static for each closure a1 and a2.

package main

import &quot;fmt&quot;

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 &lt; 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 {&quot;hello&quot;, &quot;world&quot;}
	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&#39;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 (
	&quot;fmt&quot;
)

/*
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 &lt; 10; i++ {			// call to a &quot;static&quot; var x

		x1 = fun1(&amp;x1)
		x2 = fun2(&amp;x2)

		fmt.Printf(&quot;%d     %d \n&quot;, 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(&quot;\&quot;x1\&quot; y \&quot;x2\&quot;  &quot;, x1, x2)
}

huangapple
  • 本文由 发表于 2015年5月31日 21:35:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/30558071.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定