簡體   English   中英

去:如何獲取函數中的切片長度?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM