断言 []interface{} 类型的变量是否实际上是 []string

我正在开发一个 RESTful API,需要确定用户发送了什么。


假设这是 JSON 格式的 POST 请求的主体:


{

    "request": "reset-users",

    "parameters": [

        {

            "users": ["userA","userB","userC"]

        }

    ]

}

使用json.Unmarshal,我将正文读入这个标准化结构:


type RequestBody struct {

    Request string `json:"request"`

    Parameters []map[string]interface{} `json:"parameters"`

}

所以,现在,我可以requestBody.Parameters[0]["users"]使用以下类型断言开关块检查类型:


switch requestBody.Parameters[0]["users"].(type) {

    case []interface {}:

        //It is actually a list of some type

    default:

        //Other types

}

上面提到的代码有效,但我如何才能确定某种类型的列表是字符串列表?(相对于 int 或 bool 的列表...)


HUX布斯
浏览 171回答 2
2回答

繁星淼淼

当解组为 时interface{},标准库解组器总是使用以下内容:map[string]interface{}对于对象[]interface{}对于数组string, bool, float64,nil对于值因此,当您获得 a 时[]interface{},它是一个数组,其元素可以是上述任何一种类型。您必须遍历每个并键入断言:switch v:=requestBody.Parameters[0]["users"].(type) {    case []interface {}:      for _,x:=range v {         if s, ok:=x.(string); ok {            // It is a string         }      }   ...}

神不在的星期二

文档清楚地说明了它将使用什么类型:“[]interface{}, for JSON arrays”。它将始终是[]interface{},这是一个具体类型,不能断言为任何其他类型;不可能[]string,因为那是与 不同的类型[]interface{}。的每个元素都[]interface{}可以是文档中列出的任何类型,具体取决于原始 JSON 数组的每个元素的类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go