Jestem n całkowicie jasne, co chcesz zrobić. Odpowiedź jnml powinna obejmować podstawy wszystkiego, co próbujesz zrobić.
Chciałbym dodać, że pakiet crypto
ma interesujący sposób pośredniego rejestrowania innych pakietów. W szczególności spójrz na crypto.go.
Zasadniczo, jak to działa to pakiet crypto
ma pustą mapę takiego:
var regFuncs = make(map[key]func (arg) result)
Gdzie „klucz” będzie unikatowy typ (int, string, etc ..), a wartość będzie prototyp funkcji, którego się spodziewasz.
Opakowanie to wówczas rejestruje się za pomocą funkcji init:
func init() {
master.RegisterFunc("name", myFunc)
}
pakiet ten sam być uwzględnione przy użyciu import _ "path/to/package"
.
A następnie pakiet główny będzie miał sposób na pobranie tej funkcji.
Z crypto
, można użyć sha 256 tak:
crypto.SHA256.New()
Ale trzeba najpierw umieścić go w głównym tak:
import _ "crypto/sha256"
Mam nadzieję, że to pomaga.
Dzięki! Jest to powszechnie znana i fajna własność językowa. Ale nie jest to dokładnie to, co chcę robić. Pozwól mi wyjaśnić szerzej: Mam pakiet (A) z kilkoma funkcjami i mam plaster z ciągów w innym pakiecie (B) - nazwy tych funkcji. I muszę podać nazwę funkcji z pakietu A do innej metody z pakietu B. I po prostu nie mogę używać ciągów jako argumentów, potrzebuję dokładnie nazwy funkcji. Dziwny łuk, tak. Ale myślę, że Go może sobie z tym poradzić :) –
@SergeyGerasimov: Jeśli chcesz przekazać funkcję po nazwie (_ "Potrzebuję dokładnie nazwy funkcji" _), użyj identyfikatora funkcji. Jeśli chcesz przekazać go jako ciąg ('" foo "'), przekaż identyfikator funkcji w cudzysłowach. Obie techniki pokazano powyżej. A może nie rozumiem, co masz na myśli? – zzzz
Myślę, że on oznacza, że musi, biorąc pod uwagę łańcuchową reprezentację nazwy funkcji, uzyskać (i prawdopodobnie ostatecznie wywołać) wskaźnik do nazwanej funkcji. Zakładam, że będziesz musiał użyć pakietu reflect w jakiś sposób. – joshlf