为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
HUX布斯 2022-06-13 16:47:10
我正在开发一个 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 的列表...)
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

当解组为 时interface{},标准库解组器总是使用以下内容:

  • map[string]interface{}对于对象

  • []interface{}对于数组

  • stringboolfloat64,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

         }

      }

   ...

}


查看完整回答
反对 回复 2022-06-13
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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



查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信