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

如何对作为切片的 interface{} 进行子切片?

如何对作为切片的 interface{} 进行子切片?

Go
慕容3067478 2021-07-28 17:18:12
该datastore.GetMulti(c appengine.Context, key []*Key, dst interface{})API可以让我得到最多1000元。我想得到更多。一般解决这个问题的一个明显方法是创建一个包装函数mypkg.GetMulti(),它对key[0:1000], key[1000:2000]...原始参数进行子切片 ( ) 并datastore.GetMulti()使用它们多次调用。很清楚如何 sub slice key []*Key,但我如何细分dst interface{}可能是:// dst must be a []S, []*S, []I or []P, for some struct type S, some interface// type I, or some non-interface non-pointer type P such that P or *P// implements PropertyLoadSaver. If an []I, each element must be a valid dst// for Get: it must be a struct pointer or implement PropertyLoadSaver.//// As a special case, PropertyList is an invalid type for dst, even though a// PropertyList is a slice of structs. It is treated as invalid to avoid being// mistakenly passed when []PropertyList was intended.
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

由于您是datastore.GetMulti接受interface{}参数的调用者,因此您可以提供任何具体值作为该参数;它不需要事先转换为空接口类型。换句话说,任何东西都实现了空接口,所以只需传递那个东西。


func GetMulti() {

    mySlice := make([]Whatever, 3000, 3000)

    for i := 0; i < 3; i++ {

        subSlice := mySlice[i * 1000 : (i + 1) * 1000]

        datastore.GetMulti(c,k, subSlice) // 'c' and 'k' assumed to be defined

    }

}

如果mypkg.GetMulti应该是一个通用函数,也取一个interface{}值,那么您必须使用反射,如下例所示,而不是使用每个子切片fmt.Println调用的子切片长度datastore.GetMulti:


package main


import "fmt"

import "reflect"


func GetMulti(i interface{}) {

    v := reflect.ValueOf(i)

    if v.Kind() != reflect.Slice {

        panic("argument not a slice")

    }

    l := v.Len()

    p := (l / 1000)

    for i := 0; i < p; i++ {

        fmt.Println(v.Slice(i*1000, (i+1)*1000).Len())

    }

    fmt.Println(v.Slice(p*1000, l).Len())


}


func main() {

    s := make([]int, 3560, 3560)

    GetMulti(s)

}


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

添加回答

举报

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