一个简单的go语言interfae强制转换例子,非常初级的强制转换demo。非产品代码,仅供参考。
package main
import (
"fmt"
"log"
)
func FilterByType(arr []interface{}, deviceType string, myFunc func( interface{}, string) bool) []interface{} {
var result []interface{}
if len(arr)==0 {
result = make([]interface{},0)
} else {
for _,v := range arr {
if myFunc(v, deviceType) {
result = append(result, v)
}
}
}
return result
}
type Device struct {
Id int
Name string
DeviceType string
}
func main() {
var devlist = []int{1,2,3,4,5}
var _list []interface{}
for _,v := range devlist {
_list = append(_list, v)
}
var filteredNumList = FilterByType(_list, "", func(item interface{}, deviceType string)bool {
if item.(int) > 3 {
return true
}
return false
})
log.Println("filteredNumList", filteredNumList)
var deviceList = []Device{
{1,"bj01", "磨机"},
{2,"bj02","立磨"},
{3, "xa03","提升机"},
{4, "xa04","立磨"}}
for _,v := range deviceList {
_list = append(_list, v)
}
var filteredDevlist = FilterByType(_list, "立磨", func(item interface{}, deviceType string)bool {
dev, ok := item.(Device)
if ok {
if dev.DeviceType == deviceType {
return true
}
} else {
fmt.Printf("non-device item %v\n", item)
}
return false
})
log.Println("filteredDevlist:", filteredDevlist)
}
demo说明, FilterByType(arr []interface{}, deviceType string, myFunc func( interface{}, string) bool) []interface{} 方法是简单的按照myFunc进行过滤的一个方法,它可以将传入的各种类型(interface{})都进行过滤, 因此每种类型必须提供自己真是的过滤函数myFunc,同时myFunc返回bool, 根据bool判断决定是否需要过滤出去。
因为函数入参是[]interface{}, 因此传入的参数必须通过如下形式转换
var _list []interface{}
for _,v := range devlist {
_list = append(_list, v)
}
每种类型判断的依据不同,因此在各自的myFunc进行类型转换。
if item.(int) > 3 {
return true
}
或者
dev, ok := item.(Device)
if ok {
if == deviceType {
return true
}
} else {
(“non-device item %v\n”, item)
}
运行结果:
2020/06/06 16:29:11 filteredNumList: [4 5]
non-device item 1
non-device item 2
non-device item 3
non-device item 4
non-device item 5
2020/06/06 16:29:11 filteredDevlist: [{2 bj02 立磨} {4 xa04 立磨}]`