亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何實現通用切片追加器?

如何實現通用切片追加器?

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。類型不能相互分配。


使用此函數通??梢詫⒑瘮档慕Y果附加到切片上:


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 關注
  • 277 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號