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

У меня есть проект 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, Я новичок, чтобы пойти. Может кто-нибудь помочь, почему я получаю эту ошибку?

Ответы на вопрос(3)

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

 balu20 нояб. 2018 г., 16:18
Прежде всего, спасибо за указание на это важное обновление! Небольшая мелочь: «идиоматический способ сделать относительный импорт в вашем дереве проекта был бы […]» - то, что вы описываете, все ещеабсолютный импорт, а не относительный импорт. Фактически, в соответствии с проблемой GitHub, упомянутой в часто задаваемых вопросах, с которыми вы связаны, относительный импортмы возможно раньше, но, видимо, уже нет.
 marni30 апр. 2019 г., 11:54
Я думаю, это зависит от того, как определить «абсолютный» и «относительный». Я имел в виду «относительный» в смысле существующего ТОЛЬКО в вашем текущем проекте. Существующие только относительно вашего текущего имени модуля проекта. Ни в каком публичном Git-репо; Не в центральном модульном хранилище вашей системы. Не отображается за пределами вашей текущей, в файловой системе, кодовой базы. Если вы имеете в виду «относительный» как «относительный» в файловой системе с обозначением ../../ как «, то да, вы правы. Это не может квалифицироваться как «относительный» в этом смысле слова.
Решение Вопроса


Вы должны использовать абс путь, учитывая 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
 Hafiz16 окт. 2018 г., 13:13
То есть вы имеете в виду, что если я изменю репозиторий, в котором храню свой код, мне нужно изменить все операторы импорта в моем коде? Это не кажется правильным.
 marni27 окт. 2018 г., 00:07
Этот ответ только частично правильный. Если вы используете GOPATH, то фактические операторы импорта будут иметь форму: import "github.com/user/project1/utils" Это потому, что go install работает с репозиториями git. Можно использовать относительные пути на основе файловой системы, как предложено в ответе, но это будет работать только локально, и проект не сможет использоваться совместно с другими.

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

Ваш ответ на вопрос