为了账号安全,请及时绑定邮箱和手机立即绑定

如何实现通用切片追加器?

如何实现通用切片追加器?

Go
莫回无 2021-04-12 17:14:15
我是新来的go。我正在尝试编写一个通用的“ appender”函数。这是一种简化,但是它是尝试创建一个干净的接口来处理某些列表的尝试。具体来说,我对由此产生的两个错误有疑问:package maintype 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:要附加的第一个参数必须是slice;具有接口{} prog.go:15:11:不能在Append的参数中使用ReturnInt(类型func()* int)作为GenericFunc类型为什么不能ReturnInt是类型GenericFunc?如果这不起作用,那么我根本不了解如何interface{}与函数一起使用..可以吗?您如何接受“通用”切片并使用反射将其追加?这将涉及检查GenericFunc返回与切片相同的类型,但是之后应该可以追加。
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

类型func() *interface{}((type func() *int)GenericFunc的类型类型)和(ReturnInt的类型)是不同的类型。一个返回一个*interface{}。另一个返回一个*int。类型不能相互分配。


使用此函数通常可以将函数的结果附加到切片上:


func Append(sp interface{}, f interface{}) {

    s := reflect.ValueOf(sp).Elem()

    s.Set(reflect.Append(s, reflect.ValueOf(f).Call(nil)[0]))

}

这样称呼它:


var ints []*int

Append(&ints, ReturnInt)

如果参数不是切片的指针,或者该函数未返回可分配给切片元素的值,则该函数将出现恐慌。


查看完整回答
反对 回复 2021-04-19
  • 1 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信