Як користуватися спеціальними пакетами


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перший, але, схоже, нічого не робив (файл не генерується, повідомлення про помилку). То будь-яка ідея, як я могла це зробити?


Я не встановив змінну GOPATH, лише GOROOT.
Лоран

1
запустіть go installпід каталогом mylibперший і спробуйте ще раз.
Джо

1
Дивіться також цю нитку .
kostix

@Joe, вона все ще не може працювати, запустивши "go install" всередині
hunter_tech

Відповіді:


175

По-перше, обов’язково прочитайте та зрозумійте документ "Як написати код" .

Фактична відповідь залежить від характеру вашого "спеціального пакету".

Якщо він призначений для загального користування, подумайте про використання так званого "макета коду Github" . В основному, ви робите свою бібліотеку go getпроектом окремої таблиці.

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

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

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

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

Тепер, на найвищому рівні main.go, ви могли б, import "myproject/mylib"і це буде добре.


1
Якщо я створюю новий проект (myproject2) під src /, як я можу імпортувати mylib?
Кирило

2
@Kiril, ти маєш на увазі, як ви імпортуєте mylibкод myproject2? Тоді відповідь - "за допомогою import "myproject/mylib"- ідея полягає в тому, що Go здійснює пошук імпортованих шляхів під кожною директорією, яку він витягує зі GOPATHзмінної середовища (їх називають" робочими просторами "), але цей пошук (на щастя) не рекурсивний, тому такі шляхи є ефективно "прикріплені" у відповідних робочих
місцях

4
Ще одне обов’язково прочитало: "Назви пакетів" .
кісток

1
@MatthiasSommer, як правило - шляхом вилучення цього мілібу в загальний пакет, який використовує кожен мікросервіс. Саме те, як визначено "використання", залежить від бажаного робочого процесу. При розробці корпоративного класу зазвичай використовується вендинг , але з останніми go modрозробками відповідь може бути модулемgo modпідтримує також продаж модулів).
kostix

1
@LeiYang, "пакет для імпортування" - це каталог з одним або кількома вихідними файлами Go. Щодо "як скласти пакет до .lib-файлу", а потім імпортувати файл lib "- відповідь залежить від того, що ти насправді хотів запитати. Якщо ти переймаєшся швидкістю компіляції, то не боїшся: кеш-пам'ять Go Go кешує всі результати побудови за кожним пакетом. Якщо, замість цього, ви хотіли запитати, чи можна компілювати та розповсюджувати пакунок, складений лише для двійкових файлів, відповідь - ні .
kostix

68

Для такої структури папки:

main.go
mylib/
  mylib.go

Найпростішим способом є використання цього:

import (
    "./mylib"
)

1
У останніх версіях go це більше не працює, оскільки пакет не знайдеться. Правильним було б імпортувати foo/mylib(якщо припустити папку, що містить main.go foo).
немо

6
@nemo, з останньою версією go, я завжди використовую "./mylib", і це працює.
Лоран

3
Використовуючи go 1.2, і я згоден з @ this.lau_
canadadry

8
Майте на увазі, що це робить go installперерву. Якщо ви будуєте автономний проект, який ви хочете, щоб люди завантажували та працювали go build, це добре - однак, я б застосував згаданий вище "макет коду Github" (навіть якщо ви не маєте бітбукета або подібного), якщо ви хочете отримати повну go installпідтримку .
фотоіонізований

Я пропоную не використовувати цей спосіб. Це порушить годеф. godef він не розуміє про "". імпорт
Кінг Джк

6

Щодо проекту, розміщеного на GitHub, ось що зазвичай роблять люди:

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

mylib.go

package mylib

...

main.go

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

...

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"складемо.


це не спрацює для проходження шляхів добору, таких як розміщені пакети github.
Густав
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.