Golang 将接口类型作为值和指针传入的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
在这个示例中,我们定义了一个带有一个方法Area() float64的接口Shape。我们还定义了一个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
在这个示例中,我们定义了一个拥有单个方法Area() float64的接口Shape。我们还定义了一个Circle类型,通过定义Area()方法来实现Shape接口。
然后我们定义了一个函数PrintArea,它接受一个指向Shape接口的指针作为参数,并打印其面积。在main函数中,我们创建了一个Circle类型的实例,并将其指针赋给一个Shape类型的变量。然后我们将指向该变量的指针作为参数传递给PrintArea函数。
请注意,当我们定义PrintArea函数时,我们使用Shape接口的指针作为其参数。这允许我们修改基础值的状态。在这种情况下,我们实际上并没有修改该值,但如果我们想的话,我们可以修改。
结论
编写接受接口作为参数或接口指针的函数是Go的一个强大特性,它允许您编写通用代码,可以与满足特定接口的任何类型一起使用。