【问题标题】:How to return an array of unknown type in Golang? [duplicate]如何在 Golang 中返回一个未知类型的数组? [复制]
【发布时间】:2021-09-02 05:40:06
【问题描述】:

所以我有一个方法需要返回一个数组,但我不知道要返回什么类型的数组。 要返回的这种类型的数组取决于方法逻辑。

我的方法是这样的……

func (c Case) GetFrdValues(frdFieldKey string) (interface{}, error) {
    for _, singleFrd := range c.CaseDetails.GetCase().GetFrds() {
        if singleFrd.GetIdentifier().GetFieldKey() == frdFieldKey {
            switch singleFrd.GetValue().WhichType() {
            case casespb.Value_StringValue_case:
                return []string{singleFrd.GetValue().GetStringValue()}, nil
            case casespb.Value_NumberValue_case:
                return [1]float64{singleFrd.GetValue().GetNumberValue()}, nil
            case casespb.Value_BoolValue_case:
                return [1]bool{singleFrd.GetValue().GetBoolValue()}, nil
            case casespb.Value_NullValue_case:
                return []string{}, nil
            case casespb.Value_ListValue_case:
                return GetValuesFromFrdListValue(singleFrd.GetValue().GetListValue())
            default:
                return []string{}, nil
            }
        }
    }
    return []string{}, fmt.Errorf("Frd Value contains unsupported value type %v", frdFieldKey)
}

这很好用,因为它仍然返回我想要的值的数组。

但是我需要在单独的方法中操作返回的数组。但不能覆盖列表(interface{} 类型的变量)。

因此返回值需要类似于 [] interface{}。但是,如果我有这样的情况,那么我会在我的各种返回语句中收到错误。

不能在 return 语句中使用 ([]string literal) ([]string 类型的值) 作为 []interface{} 值。

我在堆栈溢出或网络上找不到任何关于此的信息,因此我们将不胜感激!

【问题讨论】:

    标签: arrays go


    【解决方案1】:

    您可以使用反射来遍历未知类型的数组。这是一个简化的示例,它简单地打印出数组的元素。

    https://play.golang.org/p/5umonjVp90D

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        doSomething([]string{"a", "b", "c"})
        doSomething([]int{1, 2, 3})
    }
    
    func doSomething(item interface{}) {
        reflectType := reflect.TypeOf(item)
        if reflectType.Kind() == reflect.Ptr {
            reflectType = reflectType.Elem()
        }
    
        if reflectType.Kind() != reflect.Slice {
            fmt.Println("received item is not a slice")
            return
        }
    
        val := reflect.ValueOf(item)
    
        itemLength := val.Len()
        for i := 0; i < itemLength; i++ {
            fmt.Println(val.Index(i))
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 2018-04-25
      • 2022-06-16
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多