Вызов функции импортируемой через плагин структуры - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующий плагин:

package main

type Test struct {
    Id string
}

func (test *Test) GetId() string {
    return test.Id
}

var V Test

Я импортирую его в свое приложение:

package main

import (
    "fmt"
    "plugin"
)

func main() {
    p, err := plugin.Open("test.so")
    if err != nil {
        panic(err)
    }
    v, err := p.Lookup("V")
    if err != nil {
        panic(err)
    }

    fmt.Println(v)
}

К сожалению, я не могу вызвать v.getId() на нем- Есть ли способ выставить все функции, которые установлены в данной структуре?

1 Ответ

0 голосов
/ 06 декабря 2018

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())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...