Go语言中将接口类型作为值和指针传递给函数
在 Go 中,常见的是编写接受接口作为参数或接受接口指针的函数。当您希望编写适用于满足特定接口的任何类型的通用代码时,这非常有用。
接受接口类型作为值的函数
在 Go 中,接口被定义为一组方法。如果某个类型实现了接口的所有方法,则称该类型满足该接口。这意味着该类型可以在任何需要该接口的地方使用。
以下是一个接受接口类型作为值的函数示例:
示例
package main import "fmt" type Shape interface { Area() float64 } type Circle struct { Radius float64 } func (c Circle) Area() float64 { return 3.14 * c.Radius * c.Radius } func PrintArea(s Shape) { fmt.Println("Area:", s.Area()) } func main() { c := Circle{Radius: 5} PrintArea(c) }
输出
Area: 78.5
在此示例中,我们定义了一个名为 Shape 的接口,它只有一个方法 Area() float64。我们还定义了一个 Circle 类型,它通过定义 Area() 方法实现了 Shape 接口。最后,我们定义了一个名为 PrintArea 的函数,它接受 Shape 接口的值作为参数并打印其面积。
在 main 函数中,我们创建了一个 Circle 类型的实例,并将其作为参数传递给 PrintArea 函数。由于 Circle 满足 Shape 接口,因此它可以作为 PrintArea 函数的参数使用。
接受接口类型作为指针的函数
在 Go 中,常见的是编写接受接口指针作为参数的函数。当您希望修改底层值的 state 时,这非常有用。
以下是一个接受接口指针的函数示例:
示例
package main import "fmt" type Shape interface { Area() float64 } type Circle struct { Radius float64 } func (c Circle) Area() float64 { return 3.14 * c.Radius * c.Radius } func PrintArea(s Shape) { fmt.Println("Area:", s.Area()) } func main() { c := Circle{Radius: 5} s := Shape(c) PrintArea(s) }
输出
Area: 78.5
在此示例中,我们定义了一个名为 Shape 的接口,它只有一个方法 Area() float64。我们还定义了一个 Circle 类型,它通过定义 Area() 方法实现了 Shape 接口。
然后,我们定义了一个名为 PrintArea 的函数,它接受 Shape 接口的指针作为参数并打印其面积。在 main 函数中,我们创建了一个 Circle 类型的实例,并将指向它的指针赋值给 Shape 类型的变量。然后,我们将指向此变量的指针作为参数传递给 PrintArea 函数。
请注意,当我们定义 PrintArea 函数时,我们使用 Shape 接口的指针作为其参数。这使我们能够修改底层值的 state。在本例中,我们实际上并没有修改该值,但如果需要,我们可以这样做。
结论
编写接受接口作为参数或接受接口指针的函数是 Go 的一个强大功能,它允许您编写适用于满足特定接口的任何类型的通用代码。