golang - 转换[]接口到[]字符串或连接字符串

时间:2017-04-27 13:54:34

标签: go

如何将[]接口转换为[]字符串,或者只是将[]接口中的所有元素转换为连接的单个字符串?下面是显示“范围”的确切值的屏幕截图,其中类型[]接口的长度为2.在下面的代码中,大小写为“slice”目前我正在使用反射但这看起来不太好。想知道应该有一些很好的方法来加入一个切片\接口元素数组。

我也尝试过使用json unmarshall这样的“json.Unmarshal([] byte(jwtResp),& mymap)”但在将jwt.MapClaims转换为byte []

时遇到类型问题。
parsedkey, _ := jwt.ParseRSAPublicKeyFromPEM([]byte(key))
parsedToken, jwtErr := jwt.Parse(bearerToken, func(token *jwt.Token) (interface{}, error) {
    return parsedkey, nil
})
jwtValues = make(map[string]string)
// we dont know which data types we are dealing with here, so using swtich case based on value data type
jwtResp := parsedToken.Claims.(jwt.MapClaims)
    for k, v := range jwtResp {
        switch reflect.TypeOf(v).Kind() {

        case reflect.Slice:
            fmt.Println("tp is : ", reflect.TypeOf(v)) // this is []interface{}
            fmt.Println("type is : ", reflect.TypeOf(v).Kind()) // this is slice
            s := reflect.ValueOf(v)
            for i := 0; i < s.Len(); i++ {
                jwtValues[k] += s.Index(i).Interface().(string)
                jwtValues[k] += "|"
            }

        case reflect.String:
            jwtValues[k] = v.(string)

        default:
            fmt.Println("unknown datatype")
        }
    }

enter image description here

2 个答案:

答案 0 :(得分:1)

感谢您的建议。下面是我发现用“if”条件替换“switch”以及类型断言的最接近的解决方案。 '反思'代价高昂。使用下面的代码,我发现jwtResp的值是切片,字符串还是其他东西。如果是slice,则遍历值(带有字符串类型元素的[]接口)并将它们作为一个连接字符串连接起来。

for k, v := range jwtResp {
        if s, ok := v.(string); ok {
                JwtValues[k] = s
            } else if s, ok := v.([]interface{}); ok {
                sslice := make([]string, len(s))
                for i, v := range s {
                    sslice[i] = v.(string)
                }
                JwtValues[k] = strings.Join(sslice, "|")
            } else {
                logger.Log(util.LogDebug, "unknown data type")
            }
    }

答案 1 :(得分:0)

不确定是否完全理解了您的问题,但似乎您已走上正轨。

    parts := make([]string, s.Len())
    for i := 0; i < s.Len(); i++ {
        parts = append(parts, s.Index(i).String())
    }
    jwtValues[k] = strings.Join(parts, "|")