Проблема разрешения имен в многопакетном модуле go - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь создать модуль, который содержит несколько пакетов, но я не понимаю, почему я получаю ошибки.

Компоновка:

λ ~/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()
}

упак / 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 ]

1 голос
/ 22 июня 2019

В 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()
}
0 голосов
/ 22 июня 2019

Есть еще один способ избежать этого. Если вы не хотите использовать имя пакета, просто введите . перед импортом пакета. Сделав это, вы можете вызвать public fn или использовать публичную переменную этого пакета. После этого ваши файлы 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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...