Lookup
возвращает Symbol
, который является просто пустым интерфейсом.Для того, чтобы использовать это, вам нужно указать желаемый тип.В документации для примера Symbol
показаны оба символа, присвоенные ожидаемым типам:
v, err := p.Lookup("V")
if err != nil {
panic(err)
}
f, err := p.Lookup("F")
if err != nil {
panic(err)
}
*v.(*int) = 7
f.(func())() // prints "Hello, number 7"
Чтобы сделать это в своей программе, создайте нужный тип, который в данном случае является интерфейсом, потому что вы ищетеконкретный набор методов (см. раздел «Тур по Го» по интерфейсам , неявная реализация esp и утверждение типа)
Здесь мы создаем интерфейс V
в основной программе для определенияметод, который мы хотим, чем использовать утверждение типа на символ, возвращаемый из Lookup
:
type V interface {
GetId() string
}
func main() {
p, err := plugin.Open("plugin.so")
if err != nil {
panic(err)
}
s, err := p.Lookup("V")
if err != nil {
panic(err)
}
v := s.(V)
fmt.Println(v.GetId())
}