package main
import (
"fmt"
)
// Printer 接口定义
type Printer interface {
Print()
}
// 定义接受不定数量实现Printer接口类型参数的函数
func printAll(printers...Printer) {
for _, printer := range printers {
printer.Print()
}
}
// 定义实现Printer接口的类型
type MyPrinter struct {
message string
}
func (mp MyPrinter) Print() {
fmt.Println(mp.message)
}
func main() {
// 调用示例
printer1 := MyPrinter{message: "Hello, 1"}
printer2 := MyPrinter{message: "Hello, 2"}
printAll(printer1, printer2)
}
设计优势
- 灵活性:函数可以接受任意数量实现了
Printer
接口的类型,这在处理多个类似功能但具体实现不同的对象时非常方便,无需为每种数量的参数情况编写不同的函数。
- 扩展性:当有新的类型实现
Printer
接口时,无需修改 printAll
函数的代码,只需要在调用处传入新类型的实例即可,符合开闭原则。
- 代码复用:
printAll
函数的逻辑可以被复用,提高了代码的可维护性和可重用性。
可能遇到的问题
- 运行时错误:如果在调用
printAll
函数时传入了未正确实现 Printer
接口的类型,在运行时会引发 panic
,因为Go语言的接口实现是隐式的,编译时不会检查传入的参数是否实现了接口,只有在运行时调用接口方法时才会检查。
- 性能问题:由于函数接受不定数量参数,在传递大量参数时可能会带来一定的性能开销,包括内存分配和函数调用的额外开销。同时,遍历过程也会有一定的时间开销,尤其是在参数数量非常大的情况下。