Как использовать пользовательские пакеты в Голанге?
Я пытаюсь создать и использовать пользовательский пакет в 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
во-первых, но, похоже, ничего не происходит (файл не создан, сообщение об ошибке отсутствует). Так есть идеи, как я мог это сделать?
10 ответов
Во-первых, обязательно прочитайте и поймите документ "Как написать код Go".
Фактический ответ зависит от характера вашей "пользовательской упаковки".
Если он предназначен для общего использования, рассмотрите возможность использования так называемой "компоновки кода Github". По сути, вы делаете свою библиотеку отдельной go get
проект
Если ваша библиотека для внутреннего использования, вы можете пойти так:
- Поместите каталог с библиотечными файлами в каталог вашего проекта.
- В остальной части вашего проекта, обратитесь к библиотеке, используя ее путь относительно корня вашего рабочего пространства, содержащего проект.
Показывать:
src/
myproject/
mylib/
mylib.go
...
main.go
Теперь на высшем уровне main.go
, вы могли бы import "myproject/mylib"
и это будет работать хорошо.
Для этого вида структуры папок:
main.go
mylib/
mylib.go
Самый простой способ - использовать это:
import (
"./mylib"
)
Я опытный программист, но совершенно новый в мире 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. Если то, что я делаю, - плохая практика, дайте мне знать!
Для проекта, размещенного на GitHub, вот что обычно делают люди:
github.com/
laike9m/
myproject/
mylib/
mylib.go
...
main.go
mylib.go
package mylib
...
main.go
import "github.com/laike9m/myproject/mylib"
...
Я пробую много способов, но лучше всего использую go.mod и ставлю
module nameofProject.com
а затем я импортирую из того же проекта, который использую
import("nameofProject.com/folder")
Очень полезно создавать проект в любом месте
Другое решение:
добавлять src/myproject
в $ ГОПАТ.
затем import "mylib"
скомпилирует.
наконец-то я нашел решение этой проблемы. Обратите внимание, что у меня очень простая среда кодирования, также я использую базовые вещи, так как в данный момент я новичок. Я хотел использовать свою библиотеку точно так же, как использую официальные библиотеки. Мне не пришлось редактировать GOPATH или какие-либо другие системные переменные или пути, не нужно было ничего перестраивать или устанавливать. Итак, вот мое решение сверху вниз:
- В моем основном пакете у меня есть следующий код:
package main
import (
"mylib" // This is my library!!
"fmt"
)
func main() {
...
mylib.myFunc(par)
mylib.myOtherFunc(par1,par2)
...
}
- Вы должны использовать одно и то же имя пакета в файлах реализации пакета. Мой собственный пакет выглядит следующим образом:
package mylib
import (
"math"
"strconv"
"strings"
)
func myFunc(par int) {
...
}
func myOtherFunc(par1 string, par2 int) {
...
}
- Что нужно иметь в виду, чтобы правильно назвать и разместить все вещи:
Создайте подпапку с именем пакета рядом с другими пакетами. Вы можете легко найти их с помощью поиска, например. «bufio», «os» или «math» (на моей машине они находятся в папке \Go\src). В моем случае это выглядит так:
C: /Go /src /bufio /io /... /mylib /... /strings
Переместите файл пакета в эту папку. Имя папки важно, оно должно совпадать с именем пакета, так его находит ваш компилятор.
У вас может быть один или несколько файлов .go здесь, они не должны называться mylib.go, вы можете использовать любые имена, например. myMath.go, myString.go и т. д.
Повторяю: имя пакета во всех файлах .go должно быть именем вашей библиотеки (в моем случае «mylib»).
- Таким образом, в дальнейшем вы можете расширить свою собственную библиотеку новыми функциями, они могут быть реализованы в отдельных файлах .go, важно только то, что вы должны хранить этот файл в подпапке с именем «mylib», и имя пакета должно быть таким же.
Я надеюсь, что это поможет, с уважением,
Лос-Анджелес
Пакет лексики
type Analizador struct {
}
func main() {
}
En la clase пакет основной
import (
"github.com/user/lexico
)
Тем, кто сталкивается с этой проблемой, необходимо сначала инициализировать модуль go, прежде чем вы сможете использовать настраиваемый пакет.
Например, ваш каталог кода: ../mycode/main.go. Теперь вы хотите создать собственный пакет "diffcode" и импортировать его в main. Сначала вам нужно будет запустить команду «go mod init mycode» (убедитесь, что вы находитесь в каталоге «../mycode»). Теперь вы создаете пакет "diffcode", в котором есть несколько файлов. Чтобы импортировать этот пакет, вам нужно поместить это в main.go: "module / package". В данном случае «mycode / diffcode».
Существенный вопрос здесь состоит в том, чтобы адаптировать идею компиляции пакета как двоичного файла библиотеки, а затем импортировать двоичный код как стороннюю библиотеку, такую как «net/http» или «fmt», в какой-нибудь новый проект go, вместо использования исходного кода go. Мне интересно, возможно ли это для программирования Go.