Go interface强制类型转换的小demo

一个简单的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 dev.DeviceType == deviceType {
return true
}
} else {
fmt.Printf(“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 立磨}]`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值