2013-02-24 2 views
122

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

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, но, похоже, он ничего не делает (файл не генерируется, нет сообщения об ошибке). Итак, любая идея, как я могу это сделать?

+0

Какой у вас GOPATH? – jozefg

+0

Я не установил переменную GOPATH, только GOROOT. –

+1

сначала запустите 'go install' под каталогом' mylib' и повторите попытку. – Joe

ответ

121

Во-первых, обязательно прочтите и поймите документ "How to write Go code".

Фактический ответ зависит от характера вашего «пользовательского пакета».

Если это предназначено для общего использования, рассмотрите возможность использования так называемого "Github code layout". В принципе, вы делаете свою библиотеку отдельным проектом go get.

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

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

Чтобы продемонстрировать:

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

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

+1

Если я создаю новый проект (myproject2) под src /, как я могу импортировать mylib? – Kiril

+2

@Kiril, вы имеете в виду, как вы импортируете 'mylib' в код' myproject2'? Тогда ответ «с помощью« import »myproject/mylib« '- идея состоит в том, что Go ищет импортированные пути в каждой директории, извлекаемой из переменной среды GOPATH (они называются« рабочими областями »), но этот поиск (к счастью) * не рекурсивный *, поэтому такие пути эффективно «привязаны» к соответствующим рабочим пространствам. – kostix

+1

Еще одно обязательное чтение: [«Имена пакетов»] (https://blog.golang.org/package-names) – kostix

38

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

main.go 
mylib/ 
    mylib.go 

Самый простой способ заключается в использовании этого:

import (
    "./mylib" 
) 
+1

Это не работа в последних версиях go, поскольку пакет не будет найден. Правильным импортом будет 'foo/mylib' (предполагается, что папка, содержащая main.go, является' foo'). – nemo

+5

@nemo, с последней версией go, Я всегда использую «./mylib», и он работает. –

+3

Использование go 1.2 и я согласен с @ this.lau_ – canadadry

3

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

Тогда import "mylib" скомпилирует.

+0

это не будет работать для go gettable путей, таких как размещенные пакеты github. – Gustav

2

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

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

mylib.go

package mylib 

... 

основной.перейти

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

... 
0

пакет лексико

type Analizador struct { 

} 

func main() { 

} 

En La Clase пакета главного

import (

    "github.com/user/lexico 
) 
0

Я опытный программист, но, совершенно новый в 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 shit here 
} 

(Я бегу Go 1.9 на Ubuntu 16.04)

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

Смежные вопросы