碰到一个问题,定义一个包,如个把两个函数分别放在两个不同的文件里面就,但是属于同一个包的,引用时会报错,为什么?
如下是我的代码:
```
$ tree .
.
├── go.mod
├── main.go
├── readme.md
├── v1.go
└── v2.go
```
go mod是我执行`go mod init`得到的
```
$ cat go.mod
module myProject/scopeShadowClosure
go 1.14
```
主函数main.go
```
$ cat main.go
package main
func main() {
a := shadow
b := scope
a()
b()
}
```
v1.go
```
$ cat v1.go
package main
import (
"fmt"
"time"
)
func scope() {
for i := 0; i < 10; i++ {
i := i //需要加上这个语句,才会从0打印到9;否则打印的不是预期
go func() {
fmt.Println(i)
}()
}
time.Sleep(time.Second)
}
```
v2.go
```
$ cat v2.go
package main
import (
"fmt"
"time"
)
func shadow() {
for i := 0; i < 10; i++ {
go func(id int) {
fmt.Println(id)
}(i)
}
time.Sleep(time.Second)
}
```
现在命令行直接执行会报错,如下:
```
$ go run main.go
# command-line-arguments
./main.go:4:7: undefined: shadow
./main.go:5:7: undefined: scope
```
但是奇怪的是,如果通过goland执行就不报错。
我分析的原因是:这个包,没有把 v1.go v2.go这两个文件里面的内容识别出来,并默认纳入到这个包中。
现在要怎么做,谢谢了。
有疑问加站长微信联系(非本文作者)