Как использовать пользовательские пакеты

178

Я пытаюсь создать и использовать пользовательский пакет в Go. Возможно, это что-то очень очевидное, но я не могу найти много информации об этом. По сути, у меня есть эти два файла в одной папке:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

Когда я пытаюсь go run main.go , я получаю эту ошибку:

main.go:4:2: import "mylib": cannot find package

go build mylib.goСначала я попытался запустить, но, похоже, ничего не происходит (файл не создан, нет сообщения об ошибке). Так есть идеи, как я мог это сделать?

Laurent
источник
Я не установил переменную GOPATH, только GOROOT.
Лоран
1
запустите go installпод каталогом mylibfirst и попробуйте снова.
Джо
1
Смотрите также эту тему .
kostix
@ Джо, он все еще не может работать, запустив «go install» внутри
hunter_tech

Ответы:

175

Во-первых, обязательно прочитайте и поймите документ «Как написать код Go» .

Фактический ответ зависит от характера вашей "пользовательской упаковки".

Если он предназначен для общего пользования, рассмотрите возможность использования так называемой «компоновки кода Github» . По сути, вы делаете свою библиотеку отдельным go getпроектом.

Если ваша библиотека для внутреннего использования, вы можете пойти так:

  1. Поместите каталог с файлами библиотеки в каталог вашего проекта.
  2. В остальной части вашего проекта, обратитесь к библиотеке, используя ее путь относительно корня вашего рабочего пространства, содержащего проект.

Демонстрировать:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

Теперь, на верхнем уровне main.go, вы могли бы, import "myproject/mylib"и это будет работать нормально.

kostix
источник
1
Если я создаю новый проект (myproject2) в src /, как я могу импортировать mylib?
Кирилл
2
@ Кирилл, ты имеешь в виду, как ты импортируешь mylibв код myproject2? Тогда ответ «с помощью import "myproject/mylib"- идея состоит в том, что Go ищет импортированные пути в каждом каталоге, который он извлекает из GOPATHпеременной среды (они называются« рабочими пространствами »), но этот поиск (к счастью) не является рекурсивным, поэтому такие пути эффективно "закреплены" на соответствующих рабочих
местах
4
Другой должен прочитать: «Имена пакетов» .
kostix
1
@MatthiasSommer, обычно - путем извлечения mylib в общий пакет, который использует каждый микросервис. Как именно «использует» определяется, зависит от вашего предпочтительного рабочего процесса. В разработке корпоративного уровня обычно используется вендоринг , но с последними go modразработками, модуль может быть ответом (и также go modподдерживает вендорство модулей).
kostix
1
@LeiYang, «импортируемый пакет» - это каталог с одним или несколькими исходными файлами Go. Что касается того, «как собрать пакет в файл .lib», а затем импортировать файл lib », ответ зависит от того, что вы действительно хотели спросить. Если вас интересует скорость компиляции, не бойтесь: кеш инструментальной цепочки Go . все результаты сборки на основе каждого пакета Если, вместо этого, вы хотели спросить, можно ли собрать и распространить пакет двоичного только компилируются, то ответ не нет .
kostix
68

Для этого вида структуры папок:

main.go
mylib/
  mylib.go

Самый простой способ - использовать это:

import (
    "./mylib"
)
Laurent
источник
1
В последних версиях go это больше не работает, так как пакет не будет найден. Правильный импорт будет foo/mylib(при условии, что папка, содержащая main.go is foo).
Немо
6
@nemo, с последней версией go, я всегда использую "./mylib", и это работает.
Лоран
3
Используя go 1.2, и я согласен с @ this.lau_
canadadry
8
Имейте в виду, что это делает go installперерыв. Если вы создаете автономный проект, который вы хотите, чтобы люди загружали и запускали go build, это нормально - однако я бы использовал упомянутую выше «разметку кода Github» (даже если она не в битбакете или аналогична), если вам нужна полная go installподдержка ,
фотоионизировано
Я предлагаю не использовать этот способ. Это сломает Годеф. Годеф не понимает про "." Импорт
King Jk
6

Для проекта, размещенного на GitHub, вот что обычно делают люди:

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

main.go

import "github.com/laike9m/myproject/mylib"

...
laike9m
источник
6

Я опытный программист, но совершенно новый в мире Go! И, признаюсь, я столкнулся с несколькими трудностями в понимании Go ... Я столкнулся с той же проблемой, когда пытался упорядочить файлы go в подпапках. Как я это сделал:

GO_Directory (тот, который назначен в $ GOPATH)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

На файл MyProject \ Entities \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

в файле MyProject \ main.go

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(Я использую Go 1.9 в Ubuntu 16.04)

И помните, ребята, я новичок на Go. Если то, что я делаю, - плохая практика, дайте мне знать!

Диего Фаверо
источник
3

другое решение:
добавьте src/myprojectк $ GOPATH.

Потом import "mylib"скомпилирую.

Хелин Ван
источник
это не будет работать для путей go gettable, таких как пакеты, размещенные на github.
Густав
1

Я пробую так много способов, но лучше всего я использую go.mod и ставлю

module nameofProject.com

а затем я импортирую из того же проекта, который я использую

import("nameofProject.com/folder")

Очень полезно создавать проект в любом месте

Лукас Перейра де Соуза
источник