How to check if interface{} is a slice

后端 未结 3 1374
离开以前
离开以前 2021-01-12 03:49

I\'m noob in Go :) so my question may be stupid, but can\'t find answer, so.

I need a function:

func name (v interface{}) {
    if is_slice() {
              


        
3条回答
  •  醉话见心
    2021-01-12 04:05

    In your case the type switch is the simplest and most convenient solution:

    func name(v interface{}) {
        switch x := v.(type) {
        case []MyInterface:
            fmt.Println("[]MyInterface, len:", len(x))
            for _, i := range x {
                fmt.Println(i)
            }
        case MyInterface:
            fmt.Println("MyInterface:", x)
        default:
            fmt.Printf("Unsupported type: %T\n", x)
        }
    }
    

    The case branches enumerate the possible types, and inside them the x variable will already be of that type, so you can use it so.

    Testing it:

    type MyInterface interface {
        io.Writer
    }
    
    var i MyInterface = os.Stdout
    name(i)
    var s = []MyInterface{i, i}
    name(s)
    name("something else")
    

    Output (try it on the Go Playground):

    MyInterface: &{0x1040e110}
    []MyInterface, len: 2
    &{0x1040e110}
    &{0x1040e110}
    Unsupported type: string
    

    For a single type check you may also use type assertion:

    if x, ok := v.([]MyInterface); ok {
        // x is of type []MyInterface
        for _, i := range x {
            fmt.Println(i)
        }
    } else {
        // x is not of type []MyInterface or it is nil
    }
    

    There are also other ways, using package reflect you can write a more general (and slower) solution, but if you're just starting Go, you shouldn't dig into reflection yet.

提交回复
热议问题