Относительный импорт в Го

У меня есть проект go со следующей структурой каталогов

utils(pkg)
   | auth.go (has a function names test1)
controllers(pkg)
   | login.go (has a function names test2)

Я пытаюсь получить доступ к функции test1 из login.go. Вот что я сделал

import "../utils"

func test2(c *gin.Context) bool{
      utils.test1()
}

Но я всегда получаю Unresolved reference test1. Я новичок. Может кто-нибудь помочь, почему я получаю эту ошибку?

Ответ 1

Нет, в Go нет относительного импорта.
Вы должны использовать абс путь, учитывая GOPATH:

Переменная среды GOPATH указывает местоположение вашего рабочего пространства. Вероятно, это единственная переменная среды, которую вам нужно установить при разработке кода Go. Для начала создайте каталог рабочей области и установите GOPATH соответственно. см.: https://golang.org/doc/code.html#GOPATH

Пути импорта:

Путь импорта - это строка, которая однозначно идентифицирует пакет. Путь импорта пакета соответствует его расположению в рабочей области или в удаленном хранилище (объяснено ниже).

Пакеты из стандартной библиотеки имеют короткие пути импорта, такие как "fmt" и "net/http". Для ваших собственных пакетов вы должны выбрать базовый путь, который вряд ли столкнется с будущими добавлениями в стандартную библиотеку или другие внешние библиотеки.

Если вы храните свой код в хранилище исходного кода где-то, то вы должны использовать корень этого исходного хранилища в качестве базового пути. Например, если у вас есть учетная запись GitHub на github.com/user, это должен быть базовый путь.

Обратите внимание, что вам не нужно публиковать свой код в удаленном хранилище, прежде чем вы сможете его построить. Это просто хорошая привычка организовывать ваш код так, как будто вы когда-нибудь опубликуете его. На практике вы можете выбрать любое произвольное имя пути, если оно уникально для стандартной библиотеки и большей экосистемы Go.

Пример:

В этом примере предполагается, что вы установили GOPATH=/goworkdir в своей среде ОС.

Файл: goworkdir/src/project1/utils/auth.go

package utils

func Test1() string {
    return "Test1"
}

Файл: goworkdir/src/project1/controllers/login.go

package controllers

import "project1/utils"

func Test2() string {
    return utils.Test1()
}

Файл: goworkdir/src/project1/main.go

package main

import (
    "fmt"
    "project1/controllers"
)

func main() {
    fmt.Println(controllers.Test2())
}

Теперь, если вы go run main.go, вы должны увидеть вывод:

Test1

Ответ 2

Теперь это отличается от введения модулей go, начиная с go 1.11.

Таким образом, если вы переключаетесь на модули go, и если ваш модуль называется "m", тогда идиоматическим способом сделать относительный импорт в вашем дереве проекта будет использование: import "m/utils" и import "m/controllers" в местах, где вам нужно импортировать эти пакеты в вашем проекте. Для подробностей смотрите:https://github.com/golang/go/wiki/Modules#do-modules-work-with-relative-imports-like-import-subdir

Ответ 3

Я думаю, вы можете просто создать каталог поставщика рядом с исходным файлом, который действует как относительный GOPATH, а затем создать относительную символическую ссылку, которая ссылается на пакет, который вы хотите импортировать внутри каталога поставщика, а затем импортировать пакет, как если бы каталог поставщика был вашим $GOPATH/src/.