Как мне сохранить заводскую функцию в Go? - PullRequest
2 голосов
/ 08 мая 2011

Я пытаюсь удерживать функцию, которая будет возвращать новые экземпляры типа, реализующие определенный интерфейс в структуре.Вот урезанный пример:

package main

type Adder interface {
    Add(Adder)
    Val() int
}

type NewAdder func() Adder

type number int

type NewHolder struct {
    newFunc NewAdder
}

func (me *number)Add(it Adder) {
    *me += number(it.Val())
}

func (me *number)Val() int {
    return int(*me)
}

func newAdder() *number {
    return (*number)(new(int))
}

func main() {
    var holder NewHolder
    holder.newFunc = NewAdder(newAdder)
}

Когда я пытаюсь его скомпилировать, он говорит cannot convert newAdder (type func() *number) to type NewAdder.Так какой же путь для достижения моей цели?

Вот пример Python того, что я пытаюсь сделать, просто для справки:

class NewStuffMaker(object):
    def __init__(self, new):
        self.new = new

def make_new():
    return []
obj = NewStuffMaker(make_new)
new_lst = obj.new()

В идеале мне бы хотелосьчтобы иметь возможность хранить кучу этих функций (или структур, содержащих функции и некоторые другие данные) в срезе.Разве это неразумно?

1 Ответ

1 голос
/ 08 мая 2011
package main

type Adder interface {
    Add(Adder)
    Val() int
}

type FuncAdder func() Adder

type Holder struct {
    FuncAdder
    SomeOtherData string
}

type number int

func (n *number) Add(a Adder) {
    *n += number(a.Val())
}

func (n *number) Val() int {
    return int(*n)
}

func NumberAdder() Adder {
    return Adder(new(number))
}

func main() {
    var holders []Holder
    var holder Holder
    holder.FuncAdder = NumberAdder
    holder.SomeOtherData = "SomeOtherData"
    holders = append(holders, holder)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...