1、使用Go的空接口:

i.(type) 只能在switch中使用,函数没有返回值

func m_type(i interface{}) {
    switch i.(type) {
    case string:
        //...
    case int:
        //...
    }
    return
}

2、使用反射:

reflect.TypeOf(x)

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var x int32 = 20
    fmt.Println("type:", reflect.TypeOf(x))
}

3、interface实现泛型

一个 interface 被多种类型实现时,有时候我们需要区分 interface 的变量究竟存储哪种类型的值,go 可以使用 comma, ok 的形式做区分 value, ok := em.(T):em 是 interface 类型的变量,T代表要断言的类型,value 是 interface 变量存储的值,ok 是 bool 类型表示是否为该断言的类型 T。

if t, ok := i.(*S); ok {
    fmt.Println("s implements I", t)
}

进一步,可以得知interface类型可以用来作为golang的泛型, 当一个函数想要处理多个类型的数据时,只需要将入参定位interface即可,然后在函数内部进行类型转换, 如下suo

func myFunc(i interface{}) {
	n := i.(int32)
	atomic.AddInt32(&sum, n)
	fmt.Printf("run with %d\n", n)
}

参考