我正在尝试创建一个包含多个软件包的模块,但我不明白为什么会出错。
布局:
λ ~/code/go-test/src/mod-test/ » tree
.
├── cmd
│ └── a.go
├── go.mod
├── main.go
└── pkg
└── foo
└── b.go
3 directories, 4 files
main.go:
package main
import (
"fmt"
"github.com/go-test/mod-test/cmd"
)
func main() {
fmt.Println("main")
A()
}
cmd / a.go:
package cmd
import (
"fmt"
"github.com/go-test/mod-test/pkg/foo"
)
func A() {
fmt.Println("a")
B()
}
pkg / foo / b.go:
package foo
import "fmt"
func B() {
fmt.Println("B")
}
go.mod:
module github.com/go-test/mod-test
go 1.12
我收到以下错误:
λ ~/code/go-test/src/mod-test/ » go build
# github.com/go-test/mod-test/cmd
cmd/a.go:5:2: imported and not used: "github.com/go-test/mod-test/pkg/foo"
cmd/a.go:10:2: undefined: B
任何人都可以帮助解释我做错了什么以及为什么会出错吗?
谢谢
答案 0 :(得分:1)
cmd/a.go
中存在错误。您没有使用"github.com/go-test/mod-test/pkg/foo"
。另外,B()
在github.com/go-test/mod-test/pkg/foo
包下,因此必须指定它。见下文:
打包cmd
import (
"fmt"
"github.com/go-test/mod-test/pkg/foo"
)
func A() {
fmt.Println("a")
// B()
foo.B()
}
答案 1 :(得分:-1)
还有另一种避免这种情况的方法。如果您不想使用软件包名称,只需在导入软件包之前输入.
。这样,您可以调用该包的公共fn或使用公共var。完成之后,您的main.go
和cmd/a.go
文件如下所示:
main.go
:
package main
import (
"fmt"
. "github.com/go-test/mod-test/cmd"
)
func main() {
fmt.Println("main")
A()
}
cmd/a.go
:
package cmd
import (
"fmt"
. "github.com/go-test/mod-test/pkg/foo"
)
func A() {
fmt.Println("a")
B()
}