以值和指针方式接收接口类型的函数(Golang)
在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语言中,编写函数并将接口指针作为参数也是很常见的。当您想要修改底层值的状态时,这将非常有用。
下面是一个以接口指针作为参数的示例函数 –
示例
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接口。
然后,我们定义了一个以Shape接口的指针为参数的函数PrintArea,并打印其面积。在main函数中,我们创建了一个Circle类型的实例,并将其指针分配给类型为Shape的变量。然后,我们将指向该变量的指针作为参数传递给PrintArea函数。
请注意,当我们定义PrintArea函数时,我们将指向Shape接口的指针作为其参数。这样可以让我们修改底层值的状态。在这种情况下,我们实际上没有修改该值,但如果需要,我们可以这样做。
结论
编写将接口作为参数或者接口的指针作为参数的函数是Go语言的一个强大的特性,它允许您编写能够与满足特定接口条件的任何类型一起使用的通用代码。