需求:对一组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 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xinjing2015/article/details/110234509