2014-07-08 15 views
21

Czy można załadować określoną paczkę w czasie wykonywania? Chcę mieć rodzaj wtyczek, w których każdy ma te same funkcje, co inne, ale z innym zachowaniem iw zależności od pliku konfiguracyjnego, ładuje jeden lub drugi. Dzięki.Ładowanie pakietu dynamicznie w golang

Odpowiedz

9

Można rozważyć wykonanie pakiety „wtyczki” w czasie wykonywania, pisząc nowy program (powiedzmy, do katalogu temp), prowadzące poprzez exec.Command, coś wzdłuż linii exec.Command("go", "run", files…).Run()

zobaczysz niektóre podobny kod here.

+0

Cześć, dziękuję, to może rozwiązać mój problem, i mógłbym komunikować się zarówno z zeroMQ lub podobne. – Pepeluis

+2

Wykonuję "ładowanie dynamiczne" poprzez samodzielną kompilację kilku wtyczek, wtyczki te muszą obsługiwać odczyt danych ze standardowego wejścia, następnie na main.go, czytam listę wtyczek z pliku konfiguracyjnego, a następnie użyj exec.Command, aby uruchomić każdą wtyczkę (w trybie rutyna), mogę napisać do wtyczki StdinPipe, a każda wtyczka może czytać. – zhaozhi

20

Nie, funkcja Go nie obsługuje dynamicznie ładowanych bibliotek.

Najlepiej jest uruchomić wtyczkę jako własny plik wykonywalny i komunikować się z nią przez gniazda lub przez stdin/stdout.

2017 aktualizacja

Ta odpowiedź nie jest już prawdą, Go teraz obsługuje plugins.

+0

Ale w ten sposób, jak mogę załadować pakiet po raz pierwszy, nie wiedząc, który pakiet zostanie użyty? – Pepeluis

+3

Ale wciąż tylko na Linuksie (od wersji 1.8) – user2679859

+1

Cóż, Linux i osx. – OneOfOne

-3

myślę co szukasz jest specjalna funkcja init

jeśli dodać

func init() { 

} 

wewnątrz pakietu będzie to pierwszy raz, kiedy pakiet jest importowany uruchomić. Zdarza się to tylko w tym samym pliku binarnym. Jak już powiedzieli inni, go nie obsługuje dynamicznie ładowanych bibliotek.

+0

Problem z init polega na tym, że nie wiem, który pakiet powinien zostać załadowany, dopóki plik konfiguracyjny nie zostanie odczytany. Więc jeśli nie mogę załadować pakietu dynamicznie, metoda init nie jest rozwiązaniem. – Pepeluis

1

Po prostu wykonaj te czynności, tworząc kodegen odczytujący konfigurację, generuje podstawowy plik GO z ładowanymi pakietami, a następnie wykonaj polecenie, że języki kompilacji nie będą ani zapewniać dynamicznego ładowania, nawet rzutki będą w pewien sposób cierpieć, proste wystarczy przeczytać plik konfiguracyjny następnie utworzyć pliku tymczasowego niezbędnych kodów załadować się i komunikować z gniazdami lub http

+2

"języki kompilujące nie będą ani nie będą ładować dynamicznie" - c/C++ są językami kompilowanymi i udostępniają je przez "dlopen". Praktycznie wszystkie języki zapewniają pewne dynamiczne ładowanie z wyjątkiem funkcji go. – Petar

+1

A teraz jest pakiet [dlopen-package for Go] (https://godoc.org/github.com/cookieo9/goffi/dlopen), który umożliwia korzystanie z bibliotek współdzielonych. W jaki sposób je generujesz - i czy możesz zamienić Go-Code w _library_ - to osobne zagadnienia ... –

Powiązane problemy