[英]return slice of empty interface from function
有人可以解釋為什么這行不通嗎,以及如何從示例中顯示的函數返回接口切片[] interface {}?
import (
"fmt"
)
func main() {
var test []string
Test(&test)
fmt.Println(test)
}
func Test(t interface{}) {
a := []interface{}{"first", "second"}
fmt.Println(a)
t = a
}
可以在此處找到運行代碼的示例: https : //play.golang.org/p/vcEGHSdWrjv
順便說一句,這是我正在嘗試從以下位置提取數據的func
: https : //godoc.org/github.com/mongodb/mongo-go-driver/mongo#Collection.Distinct
注意:我們期望的類型並不總是[]string
類型,這里我僅以string為例。
謝謝!
在您的示例中,您不是要“返回”一個切片,而是要修改參數以指向新的字符串切片。
您執行此操作的方法無效,因為在Go中,參數是通過值傳遞的。
執行此操作時:
t = a
t
是要作為參數發送給函數的&test
的副本 。
因此,修改t
不會更改您的test
變量。
您需要傳入指針的地址,以便能夠修改指針指向的內容。
嘗試這種方式:
func main() {
var test *[]string
Test(&test)
fmt.Println(*test)
}
func Test(t interface{}) {
a := []string{"first", "second"}
fmt.Println(a)
*t.(**[]string) = &a
}
輸出:
[first second]
[first second]
因為[]字符串和[]接口{}是不同的類型,所以不能將一個分配給另一個。
您必須復制切片以將[] interface {}轉換為某些特定類型的切片。 如果您知道[] interface {}始終包含字符串值,請使用以下命令:
func stringSlice() []string {
a := []interface{}{"first", "second"} // query result
fmt.Println(a)
result := make([]string, len(a))
for i := range a {
var ok bool
result[i], ok = a[i].(string)
if !ok {
// handle error with unexpected type
}
}
return result
}
如果結果可以具有任意元素類型,則使用反射來復制切片:
func anySlice(result interface{}) {
a := []interface{}{"first", "second"} // query result
slice := reflect.ValueOf(result).Elem()
elementType := slice.Type().Elem()
for _, v := range a {
rv := reflect.ValueOf(v)
if !rv.Type().AssignableTo(elementType) {
// handle error with unexpected type
}
slice.Set(reflect.Append(slice, rv))
}
}
像這樣使用它:
var s []string
anySlice(&s)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.