多包组合模块中的名称解析问题

时间:2019-06-22 06:50:22

标签: go

我正在尝试创建一个包含多个软件包的模块,但我不明白为什么会出错。

布局:

λ ~/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

任何人都可以帮助解释我做错了什么以及为什么会出错吗?

谢谢

2 个答案:

答案 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.gocmd/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()
}