[英]Go: How to get length of slice in function?
我有一個功能,我想向其提供不同種類的切片,然后再遍歷它們並打印其內容。 以下代碼有效:
func plot(data interface{}){
fmt.Println(data)
//fmt.Println(len(data))
}
func main() {
l := []int{1, 4, 3}
plot(l)
}
但是,當我取消注釋打印切片長度的行時,會出現錯誤,指出invalid argument data (type interface {}) for len
。
知道如何獲取切片的長度以便可以在其上循環嗎?
您應盡可能避免使用interface {}。 您想做的事可以通過反射來完成,但是反射是必不可少的。 它確實適合編組,但應謹慎使用。 如果仍然要使用反射,可以執行以下操作:
func plot(data interface{}) {
s := reflect.ValueOf(data)
if s.Kind() != reflect.Slice {
panic("plot() given a non-slice type")
}
for i := 0; i < s.Len(); i++ {
v := s.Index(i)
...
}
}
即使執行此操作,v仍然是reflect.Value 。 然后,您將需要以某種方式將其轉換為有用的東西。 幸運的是,Value有許多可用於轉換它的方法。 在這種情況下, v.Int()
會將值返回為int64。
如注釋中所提示,您將必須使用反射來執行此操作,如下所示:
var sliceLen int
switch reflect.TypeOf(data).Kind() {
case reflect.Slice:
sliceLen = s.Len();
default:
//error here, unexpected
}
}
盡管go可以在需要時(以及許多其他用途)提供反思,以做這些小技巧,但通常最好避免盡可能保持編譯器類型的安全性和性能,並考慮為不同數據提供單獨功能的利弊這種方法的類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.