Go中的静态局部变量

Gus*_*urt 25 go

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

C中的示例:

int func() {
    static int x = 0; 
    x++;
    return x;
}
Run Code Online (Sandbox Code Playgroud)

Iam*_*NaN 26

使用闭包:

函数文字是闭包:它们可以引用周围函数中定义的变量.然后,这些变量在周围函数和函数文本之间共享,只要它们可访问,它们就会存在.

它不必位于全局范围内,只是在函数定义之外.

func main() {

    x := 1

    y := func() {
        fmt.Println("x:", x)
        x++
    }

    for i := 0; i < 10; i++ {
        y()
    }
}
Run Code Online (Sandbox Code Playgroud)

(围棋游乐场的样本)

  • 遗憾的是,该函数位于 main 之外,因此这种模式对我不起作用。 (2认同)
  • 不确定我们是否真的可以将此用法与静态进行比较。这不是更像一个全局变量吗... x for func 是全局变量。 (2认同)

mji*_*son 14

在全局范围内声明var:

var i = 1

func a() {
  println(i)
  i++
}
Run Code Online (Sandbox Code Playgroud)


Tar*_*rik 8

你可以做这样的事情

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
}
Run Code Online (Sandbox Code Playgroud)

Playground上的链接https://play.golang.org/p/D9mv9_qKmN

  • +1,因为它既是线程安全的(与 mjibson 的答案不同),而且使用持久变量的函数可以独立进行单元测试(与 IamNaN 接受的答案不同)。 (3认同)