Go中的静态局部变量

时间:2015-05-31 13:35:20

标签: go

是否可以在Go中定义一个可以将其值从一个函数调用维护到另一个函数的局部变量?在C中,我们可以使用保留字static来完成此操作。

C:

中的示例
int func() {
    static int x = 0; 
    x++;
    return x;
}

6 个答案:

答案 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
}

游乐场上的链接https://play.golang.org/p/D9mv9_qKmN

答案 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)

Use Function closure

在下面的示例中,变量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