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
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.
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.
Ale w ten sposób, jak mogę załadować pakiet po raz pierwszy, nie wiedząc, który pakiet zostanie użyty? – Pepeluis
Ale wciąż tylko na Linuksie (od wersji 1.8) – user2679859
Cóż, Linux i osx. – OneOfOne
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.
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
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
"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
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 ... –
jest wsparcie dla tego teraz jako odchodzenia 1,8
- 1. Dynamicznie ładowanie Google Maps api
- 2. właściwości Ładowanie Log4J z pakietu w java
- 3. Golang 1.5 dostawcy - Nie można znaleźć pakietu
- 4. Nie mogę dostać pakietu GoLang oracle
- 5. Wystąpił błąd wewnętrzny podczas: "Ładowanie pakietu [...]"
- 6. Mapy Google zmieniają język dynamicznie (ładowanie asynchroniczne)
- 7. Ładowanie SVG do SVGWeb dynamicznie z JQuery
- 8. Czy mogę dynamicznie usuwać wartości instancji typu struct w golang?
- 9. Importowanie struktury z innego pakietu i pliku golang
- 10. Ładowanie modułów Node.js dynamicznie w oparciu o trasę
- 11. Ładowanie biblioteki dynamicznie w systemie Linux lub OSX?
- 12. Jak działają pakiety w golang
- 13. Ładowanie szablonów wąsów za pomocą pakietu Web Pack
- 14. Ładowanie obrazów ng-src za pomocą pakietu internetowego
- 15. Ładowanie pakietu html + zasobów do wyświetlenia strony internetowej
- 16. jak dynamicznie zmienić tytuł strony aspx na ładowanie strony
- 17. Ładowanie JavaScript dynamicznie i jak sprawdzić, czy skrypt istnieje
- 18. Dynamicznie wymagają modułu aliasowego przy użyciu pakietu internetowego
- 19. Bezcielesnego funkcja w Golang
- 20. testing.M odzyskać w golang
- 21. drukowania "(cudzysłów) w GoLang
- 22. Wybieranie funkcji z listy funkcji w Golang
- 23. golang - jak pobrać plik w przeglądarce z serwera golang?
- 24. Go get błąd - nie można załadować pakietu
- 25. Podkatalogi Golang
- 26. Jak uzyskać ponowne ładowanie pakietu internetowego w celu wykrycia zmian w mopsie + ekspresie?
- 27. Leniwe ładowanie w pliku node.js
- 28. Jak dynamicznie ładować czcionkę pod iOS. (na prawdę)
- 29. Zachowanie Ticker Stop w Golang
- 30. Concat kilka plasterków w golang
Cześć, dziękuję, to może rozwiązać mój problem, i mógłbym komunikować się zarówno z zeroMQ lub podobne. – Pepeluis
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