MST

星途 面试题库

面试题:Go不定参数函数与接口类型结合应用

定义一个Go函数,它接受不定数量的实现了某个接口的类型参数,在函数内部遍历这些参数并调用接口方法。假设已有一个 `Printer` 接口,包含 `Print` 方法用于打印信息,实现这个函数并给出调用示例,同时阐述这样设计的优势和可能遇到的问题。
13.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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)
}

设计优势

  1. 灵活性:函数可以接受任意数量实现了 Printer 接口的类型,这在处理多个类似功能但具体实现不同的对象时非常方便,无需为每种数量的参数情况编写不同的函数。
  2. 扩展性:当有新的类型实现 Printer 接口时,无需修改 printAll 函数的代码,只需要在调用处传入新类型的实例即可,符合开闭原则。
  3. 代码复用printAll 函数的逻辑可以被复用,提高了代码的可维护性和可重用性。

可能遇到的问题

  1. 运行时错误:如果在调用 printAll 函数时传入了未正确实现 Printer 接口的类型,在运行时会引发 panic,因为Go语言的接口实现是隐式的,编译时不会检查传入的参数是否实现了接口,只有在运行时调用接口方法时才会检查。
  2. 性能问题:由于函数接受不定数量参数,在传递大量参数时可能会带来一定的性能开销,包括内存分配和函数调用的额外开销。同时,遍历过程也会有一定的时间开销,尤其是在参数数量非常大的情况下。