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)
}