猿问

在 The Way to Go 一书中的代码示例 11.1 中如何使用接口?

我正在学习 Go 并试图完全理解如何在 Go 中使用接口。


在 The Way to Go 一书中,有一个示例清单 11.1(第 264-265 页)。我觉得我对它的理解肯定缺少一些东西。代码运行良好,但我不明白接口对结构和方法有什么影响(如果有的话)。


package main

import "fmt"



type Shaper interface {

    Area() float32

}


type Square struct {

    side float32

}


func (sq *Square) Area() float32 {

         return sq.side * sq.side

}


func main() {

    sq1 := new(Square)

    sq1.side = 5

    // var areaIntf Shaper

    // areaIntf = sq1

    // shorter, without separate declaration:

    // areaIntf := Shaper(sq1)

    // or even:

    areaIntf := sq1

    fmt.Printf("The square has area: %f\n", areaIntf.Area())


}


万千封印
浏览 193回答 1
1回答

Helenr

在那个例子中,它没有效果。接口允许不同的类型遵守一个共同的契约,允许你创建通用的函数。这是Play上的修改示例注意 printIt 函数,它可以采用任何符合 Shaper 接口的类型。如果没有接口,您将不得不创建 printCircle 和 printRectangle 方法,随着时间的推移,您将越来越多的类型添加到您的应用程序中,这实际上不起作用。package mainimport (    "fmt"    "math")type Shaper interface {    Area() float32}type Square struct {    side float32}func (sq *Square) Area() float32 {    return sq.side * sq.side}type Circle struct {    radius float32}func (c *Circle) Area() float32 {    return math.Pi * c.radius * c.radius}func main() {    sq1 := new(Square)    sq1.side = 5    circ1 := new(Circle)    circ1.radius = 5    var areaIntf Shaper    areaIntf = sq1    // areaIntf = sq1    // shorter, without separate declaration:    // areaIntf := Shaper(sq1)    // or even:    fmt.Printf("The square has area: %f\n", areaIntf.Area())    areaIntf = circ1    fmt.Printf("The circle has area: %f\n", areaIntf.Area())    // Here is where interfaces are actually interesting    printIt(sq1)    printIt(circ1)}func printIt(s Shaper) {    fmt.Printf("Area of this thing is: %f\n", s.Area())}
随时随地看视频慕课网APP

相关分类

Go
我要回答