在Go中测试值的类型

Im trying to validate a JSON object in Go. I'm trying to see if the 'tags' attribute is an array.( Later on I'll also want to know if another attribute is an object too).

I have reached to this. If I print reflect.TypeOf(gjson.Get(api_spec, "tags").Value() I get :

string   // When the field is a string
[]interface {} // When the field is an array
map[string]interface {} // When the field is an object

But when trying to test this on the below code :

if ( gjson.Get(api_spec, "tags").Exists() ) {
            if ( reflect.TypeOf(gjson.Get(api_spec, "tags").Value()) != "[]interface {}" ) {
             // some code here ...
            }
        }

I get the below error code :

invalid operation: reflect.TypeOf(gjson.Get(api_spec, "tags").Value()) != "[]interface {}" (mismatched types reflect.Type and string)

Thanks in advance!

Use a type assertion to determine if a value is a []interface{}:

v := gjson.Get(api_spec, "tags").Value()
_, ok := v.([]interface{}) // ok is true if v is type []interface{}

Here's the code in the question modified to use a type assertion:

if gjson.Get(api_spec, "tags").Exists() {
    if _, ok := gjson.Get(api_spec, "tags").Value().([]interface{}); !ok {
        // some code here ...
    }
}

There's no need to use reflection. If you do want to use reflection for some reason (and I don't see a reason in the question), then compare reflect.Type values:

// Get type using a dummy value. This can be done once by declaring
// the variable as a package-level variable.
var sliceOfInterface = reflect.TypeOf([]interface{}{})

ok = reflect.TypeOf(v) == sliceOfInterface  // ok is true if v is type []interface{}

run the code on the playground

reflect.TypeOf returns a Type object. See docs at https://golang.org/pkg/reflect/#TypeOf

Your code should read:

if reflect.TypeOf(gjson.Get(api_spec, "tags").Value()).Name() != "[]interface {}" {
    // some code here ...
}

When you print a type to console, it's converted to a string; however, as you can see from the documentation for TypeOf, it does not return a string, it returns a reflect.Type. You can use Kind() to test programmatically what it is:

        if reflect.TypeOf(gjson.Get(api_spec, "tags").Value()).Kind() != reflect.Slice {

Other Kinds you might be interested in are reflect.String and reflect.Map.