Как определить тип функции, который принимает любое количество аргументов в Go?

Я пытаюсь написать функцию, которая берет любую другую функцию и оборачивает ее вокруг новой функции. Это то, что я пробовал до сих пор:

package main

import (
    "fmt"
)

func protect (unprotected func (...interface{})) (func (...interface{})) {
    return func (args ...interface{}) {
        fmt.Println ("protected");
        unprotected (args...);
    };
}

func main () {
    a := func () {
        fmt.Println ("unprotected");
    };
    b := protect (a);
    b ();
}

Когда я компилирую это я получаю сообщение об ошибке:

cannot use a (type func()) as type func(...interface { }) in function argument

Почему функция без аргументов несовместима с функцией с переменным числом аргументов? Что я могу сделать, чтобы сделать их совместимыми?

Обновление: Защищенная функция должна быть совместима с оригиналом:

func take_func_int_int (f func (x int) (y int)) (int) {
    return f (1)
}

func main () {

    a := func (x int) (y int) {
        return 2 * x
    }
    b := protect (a)

    take_func_int_int (a)
    take_func_int_int (b)
}
7
задан ceving 20 May 2011 в 07:52
поделиться