package mainimport "fmt"type Handler interface { DoFunc(k, v interface{})}type HandlerFunc func(k, v interface{})
func (f HandlerFunc) DoFunc(k, v interface{}) {
f(k, v)
}type greet stringfunc (g greet) selfintroduction(k, v interface{}) { fmt.Printf("%s,在下%s,我的必杀技是%s\n", g, k, v)}func DoEach(m map[interface{}]interface{}, h Handler) { if m != nil && len(m) > 0 { for k, v := range m { h.DoFunc(k, v) } }}func EachFunc(m map[interface{}]interface{}, f func(k, v interface{})) { DoEach(m, HandlerFunc(f))}func main() { persons := make(map[interface{}]interface{}) persons["乔峰"] = "龙爪手" persons["鸠摩智"] = "小无相功" persons["慕容复"] = "斗转星移" var g greet = "诸位英雄" EachFunc(persons, g.selfintroduction)}
复制代码
上面我们新增了一个EachFunc函数,帮助调用者强制转型,调用者就不用自己做了。
现在我们发现EachFunc函数接收的是一个func(k, v interface{})类型的函数,没有必要实现原Handler接口了,所以我们新的类型可以去掉不用了。
去掉了自定义类型greet之后,整个代码更简洁,可读性是不是更好点?简洁干净的完整代码如下:
package mainimport "fmt"type Handler interface { DoFunc(k, v interface{})}type HandlerFunc func(k, v interface{})
func (f HandlerFunc) DoFunc(k, v interface{}) {
f(k, v)
}func DoEach(m map[interface{}]interface{}, h Handler) { if m != nil && len(m) > 0 { for k, v := range m { h.DoFunc(k, v) } }}func EachFunc(m map[interface{}]interface{}, f func(k, v interface{})) { DoEach(m, HandlerFunc(f))}func selfintroduction(k, v interface{}) { fmt.Printf("诸位英雄,在下%s,我的必杀技是%s\n", k, v)}func main() { persons := make(map[interface{}]interface{}) persons["乔峰"] = "龙爪手" persons["鸠摩智"] = "小无相功" persons["慕容复"] = "斗转星移" EachFunc(persons, selfintroduction)}