Как подключить локальную функцию из другой директории в Go?
Создал проект (вне пути GOPATH или GOROOT) на фреймворке Echo. Получилась следующая структура:
lolo
--views
----count_private.go
--statics
--go.mod
--go.sum
--logs.log
--main.go
Код в main.go
package main
import (
"views"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
// group_module := e.Group("/module")
// group_module.GET("/f_count_private", views.f_count_private(e))
e.Logger.Fatal(e.Start(":1323"))
}
Код в count_private.go
package views
import (
"github.com/labstack/echo"
)
func f_count_private(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
}
При запуске кода через команду
$ go run main.go
выдается ошибка:
main.go:4:2: package views is not in GOROOT (C:\Program Files\Go\src\views)
Подскажите пожалуйста, как обойти ошибку и сделать так, чтобы я мог в main() использовать функцию f_count_private(...) из другого файла?
Ответы (1 шт):
Пакет views нужно импортировать по полному пути. Например, если в go.mod у вас написано module example.org, то импортировать нужно example.org/views.
Но даже так функция f_count_private не будет видна. Имя этой функции начинается с маленькой буквы, что в go означает внутреннюю функцию пакета. Имена экспортируемых функций должны начинаться с заглавной буквы: F_count_private
Но если вы хотите сделать эту функцию приватной, то есть в вашем модуле ей можно пользоваться, а другие модули не смогли её вызывать, то вам нужно сделать пакет internal/views. Публичные функции из этого пакета будут видны внутри вашего модуля, но недоступны другим модулям.
Я сделал небольшой проект для иллюстрации
В этом проекте два модуля, mod1 и mod2. В модуле mod1 есть пакет internal/views, в котором определена функция CountPrivate. Эта функция вызывается в mod1/main.go без проблем.
При компиляции идентичного файла mod2/main.go компилятор ругается:
mod2$ go run main.go
package command-line-arguments
main.go:4:5: use of internal package example.org/mod1/internal/views not allowed