type MathFunc func(int, int) int declares a *new* type, called MathFunc,
with underlying type func(int, int) int, which is why the type-assertion
fails - you are checking whether the type is *exactly* MathFunc, not "has
the same underlying type".

There are several things you could do, apart from what you mentioned. You
could use reflect and check for assignability
<https://godoc.org/reflect#Type.AssignableTo>. You could type-assert to the
func-type and do the conversion:
f := MathFunc(sym.(func(int, int) int))
You could support using either via, e.g.

var f MathFunc
switch v := sym.(type) {
case MathFunc:
    f = v
case func(int, int) int:
    f = MathFunc(v)
default:
    panic("wrong type")
}

You could (from go1.9 on) make MathFunc an alias:
type MathFunc = func(int, int) int
in which case the two are interchangeable (so the type-assertion succeeds)
and you still get a name for the type for documentation purposes.

Or you could just forego the MathFunc type altogether and just use
func(int, int) int in your code.

FWIW, the reason http has HandlerFunc, is mainly to add a method
<http://godoc.org/net/http#HandlerFunc.ServeHTTP> to it to make it an
http.Handler <https://godoc.org/net/http#Handler>, to make it easier to
implement that interface.

On Sun, Sep 3, 2017 at 11:47 AM, Miki Tebeka <[email protected]> wrote:

> Hi,
>
> Assume I have a plugin:
> package main
>
> func Add(x, y int) int {
> return x + y
> }
>
> func main() {}
>
> I'd like to make sure that plugin functions are from certain type. So I
> wrote (ignore panics, they are for brevity):
> Enter code here...package main
>
> import (
> "fmt"
> "plugin"
> )
>
> type MathFunc func(int, int) int
>
> func main() {
> p, err := plugin.Open("./plugin.so")
> if err != nil {
> panic(err)
> }
> sym, err := p.Lookup("Add")
> if err != nil {
> panic(err)
> }
>
>
> // fn := sym.(MathFunc)
> fn := sym.(func(int, int) int)
> fmt.Println(fn(1, 2))
> }
>
> The commented out line causes a panic.
>
> The other way I see is to expose MathFunc to plugins but then plugin
> writers will have to write something like:
> var Add = MathFunc(func(x, y int) int {
> return x + y
> })
>
> Which is ugly :)
>
> Any way around this? (I saw that http.HandleFunc gets the function
> signature like I do now - so I guess this is the best way, but worth
> checking).
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to