需求:对一组int类型的数据去重,并取出能同时被2和3整除的数据。
package main
import "fmt"
/*
1. 联系接口实现多态
2. 数组去重
3. 根据给定值对去重后的数组进行筛选
*/
// 创建一个接口,包含两个方法
type Filter interface {
About() string
Process([]int) []int
}
// 定义一个Struct对象
type UniqueFilter struct{}
// 为UniqueFilter对象添加About方法
func (UniqueFilter) About() string {
return "去除重复值"
}
// 为UniqueFilter对象添加Process方法
func (UniqueFilter) Process(inputs []int) []int {
var outs = make([]int, 0, len(inputs))
tmp := make(map[int]bool)
for _, v := range inputs {
if !tmp[v] {
tmp[v] = true
outs = append(outs, v)
}
}
return outs
}
// 定义一个int类型对象
type MultipleFilter int
// 为int类型对象实现About方法
func (mf MultipleFilter) About() string {
return fmt.Sprintf("保留%v的倍数", mf)
}
// 为int类型对象实现Process方法
func (mf MultipleFilter) Process(inputs []int) []int {
var outs = make([]int, 0, len(inputs))
for _, v := range inputs {
if v%int(mf) == 0 {
outs = append(outs, v)
}
}
return outs
}
// 在多态特性的帮助下,只需要一个filteAndPrint函数,传入接口和原数据,返回处理结果
func filterAndPrint(f Filter, unfiltered []int) []int {
filter := f.Process(unfiltered)
fmt.Println(f.About(), ":\n\t", filter)
return filter
}
func main() {
numbers := []int{23, 34, 23, 234, 45, 3, 2, 3, 23, 3, 4, 53, 32, 23, 4, 2, 34, 2, 5, 34, 3, 4, 3, 2}
fmt.Println("原数据:", "\n\t", numbers)
// 三个对象被包裹在一个列表中
filters := []Filter{
UniqueFilter{},
MultipleFilter(2),
MultipleFilter(3),
}
// 循环列表,依次传入处理对象和数据
for _, v := range filters {
// 将处理结果保存,传入下一次循环体中,进行下一次循环处理
numbers = filterAndPrint(v, numbers)
}
}
版权声明:本文为xinjing2015原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。