在golang func中引用var是否正确?

时间:2016-05-27 15:23:57

标签: go

如果我这样做:

 <script type="text/javascript">
     $(document).ready(function(){
     $('#service_type').change(function () {
                $('#service_info').show('slide');
            }); 
        });    
</script>

在func中引用foo错误了吗?

2 个答案:

答案 0 :(得分:1)

没关系,只有在改变上下文时才需要注意(在本地指针变量的情况下):

package main

import (
    "errors"
    "fmt"
)

func test() {
    defer func() { fmt.Println(1) }()
    defer func() { fmt.Println(2) }()
    defer func() { fmt.Println(3) }()
}

func main() {
    test()
    err := errors.New("error 1")
    defer func() { fmt.Println(err) }()
    err = errors.New("error 2")
}

并且还看到:
https://www.goinggo.net/2014/06/pitfalls-with-closures-in-go.html

答案 1 :(得分:-3)

它不是“错误的”,但它不是好的做法。

让我稍微扩展一下。

让我说我这样做:

func main() {
  foo := 1
  go func() {
    foo = 2
    fmt.Println(foo)
  }()
}

在上面的情况中,将打印2。现在假设foo := 1foo=2之间有20多行。由于变化不是明确,因此您很有可能获得您不期望的行为并且您将很难跟踪。相反,你应该这样做:

func main() {
  foo := 1
  go func(bar int) {
    bar = 2
    fmt.Println(bar)
  }(foo)
}

现在,代码明确更改了barfoo(相当于func(int bar))的值。要更改foomain的值,请执行以下操作:

func main() {
  foo := 1
  go func(bar *int) {
    *bar = 2
    fmt.Println(*bar)
  }(&foo)
}