簡體   English   中英

從函數返回空接口的切片

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

順便說一句,這是我正在嘗試從以下位置提取數據的funchttps : //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]

游樂場: https : //play.golang.org/p/tliMrmliykp

因為[]字符串和[]接口{}是不同的類型,所以不能將一個分配給另一個。

您必須復制切片以將[] 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.

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