关于go:如何实现通用的切片附加器?

How to implement a generic slice appender?

我对go比较陌生。我正在尝试编写一个通用的"appender"函数。这是一种简化,但它试图创建一个干净的接口来处理一些列表。具体来说,我对这会产生的两个错误有疑问:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

type GenericFunc func() *interface{}
func Append(ints interface{}, f GenericFunc) {
    ints = append(ints, f())
}

func ReturnInt() *int {
    i := 1
    return &i
}

func main() {
    var ints []*int
    Append(ints, ReturnInt)
}

游乐场

prog.go:5:18: first argument to append must be slice; have interface
{} prog.go:15:11: cannot use ReturnInt (type func() *int) as type
GenericFunc in argument to Append

  • 为什么ReturnInt不能是GenericFunc型?如果这不起作用,我根本不理解interface{}如何与函数一起使用。可以吗?
  • 如何接受"通用"切片并使用反射附加到它?这将涉及检查GenericFunc是否返回与切片相同的类型,但在该类型之后应该可以进行追加。

  • func() *interface{}型(型)genericfunc)和(type func() *int)(《大学returnint型)是不同的类型。(一*interface{}归来。其他的*int归来。这两种类型都不assignable每个其他。

    使用这两个功能generically append结果的两个功能:一片

    1
    2
    3
    4
    func Append(sp interface{}, f interface{}) {
        s := reflect.ValueOf(sp).Elem()
        s.Set(reflect.Append(s, reflect.ValueOf(f).Call(nil)[0]))
    }

    这样的信息:呼叫

    1
    2
    var ints []*int
    Append(&ints, ReturnInt)

    "如果这个功能会恐慌的说法冰槽的两个螺旋的指针或函数不返回一个值assignable两个螺旋元件。

    playground example