Golang | 使用接口实现多态

Posted Parker@1989

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang | 使用接口实现多态相关的知识,希望对你有一定的参考价值。

需求:对一组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 := []int23, 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)
	


以上是关于Golang | 使用接口实现多态的主要内容,如果未能解决你的问题,请参考以下文章

Golang如何体现面向对象三大特征之多态?

golang结构体组合与“多态” 2021-08-06

[Golang]面向对象营养餐,一文管够(封装,继承,多态)

『GoLang』面向对象

Golang-接口(interface)

Golang入门到项目实战 | golang接口和类型的关系