Работа с локальными модулями в go

Есть папка go

введите сюда описание изображения

в которой также есть две папки - greeting и hello

greeting.go

package greeting

import "fmt"

func Hello() {
    fmt.Println("Hello!")
}
func Hi() {
    fmt.Println("Hi!")
}

hello.go

package main

import gr "greet/greeting"

func main() {
    gr.Hello()
    gr.Hi()
}

Получается, я хочу импортировать greeting в hello, но ошибка в том, что в GOPATH указан путь по умолчанию, в диск C, у меня же, проект go находится на диске D. Конечно можно создать терминал и в нем указать путь в GOPATH для go, но придется каждый раз менять GOPATH для каждого нового созданного терминала. Второй вариант - go.mod. Но при инициализации go.mod

введите сюда описание изображения

он ищет пакет в GOROOT пути.

Как можно решить эту проблему, подскажите пожалуйста?


Ответы (2 шт):

Автор решения: Владимир Клыков

greeting/greeting.go

package greeting

import "fmt"

func Hello() {
    fmt.Println("Hello!")
}
func Hi() {
    fmt.Println("Hi!")
}

greeting/go.mod

module greeting

go 1.17

hi/main.go

package main

import gr "greet/greeting"

func main() {
    gr.Hello()
    gr.Hi()
}

hi/go.mod

module Test

go 1.17
require (
    greet/greeting v0.0.0 // indirect
)

replace greet/greeting => ../greeting

введите сюда описание изображения

→ Ссылка
Автор решения: Ivan Pyrov

Больше не работает :( К сожалению, поведение с тех пор изменили. См. https://go.dev/wiki/Modules#do-modules-work-with-relative-imports-like-import-subdir Теперь надо писать в go.mod так:

module example.com/me/hello

require (
  example.com/me/goodbye v0.0.0
)

replace example.com/me/goodbye => ../goodbye
→ Ссылка