MST

星途 面试题库

面试题:Go语言接口继承扩展中的类型断言与多态应用

在Go语言中,已知有接口`Shape`包含`Area`方法用于计算图形面积。接口`Rectangle`继承自`Shape`并新增`Perimeter`方法用于计算周长。现有结构体`Square`实现了`Rectangle`接口。编写一个函数,接受`interface{}`类型参数,使用类型断言判断传入参数是否实现了`Rectangle`接口,如果实现了,则调用`Area`和`Perimeter`方法,并打印结果。同时,展示如何通过多态的方式,在一个切片中存储不同实现了`Rectangle`接口的结构体,然后遍历切片并调用相应方法。
22.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

// Shape 接口定义计算面积的方法
type Shape interface {
    Area() float64
}

// Rectangle 接口继承自Shape并新增计算周长的方法
type Rectangle interface {
    Shape
    Perimeter() float64
}

// Square 结构体实现Rectangle接口
type Square struct {
    Side float64
}

// Area 实现Shape接口的面积计算方法
func (s Square) Area() float64 {
    return s.Side * s.Side
}

// Perimeter 实现Rectangle接口的周长计算方法
func (s Square) Perimeter() float64 {
    return 4 * s.Side
}

// 接受interface{}类型参数,判断是否实现Rectangle接口并调用方法
func processShape(i interface{}) {
    if r, ok := i.(Rectangle); ok {
        fmt.Printf("Area: %.2f, Perimeter: %.2f\n", r.Area(), r.Perimeter())
    } else {
        fmt.Println("The parameter does not implement the Rectangle interface.")
    }
}

func main() {
    // 创建Square实例
    square := Square{Side: 5}

    // 调用processShape函数
    processShape(square)

    // 通过多态在切片中存储不同实现Rectangle接口的结构体
    var rectangles []Rectangle
    rectangles = append(rectangles, square)

    // 遍历切片并调用相应方法
    for _, r := range rectangles {
        fmt.Printf("Area: %.2f, Perimeter: %.2f\n", r.Area(), r.Perimeter())
    }
}
  1. 接口与结构体定义
    • 定义了Shape接口,包含Area方法。
    • Rectangle接口继承自Shape,并新增Perimeter方法。
    • Square结构体实现了Rectangle接口。
  2. processShape函数
    • 使用类型断言i.(Rectangle)判断传入的interface{}类型参数是否实现了Rectangle接口。
    • 如果实现了,则调用AreaPerimeter方法并打印结果。
  3. 多态的实现
    • main函数中,创建Square实例,并将其存储在Rectangle类型的切片中。
    • 遍历切片,通过多态调用每个元素的AreaPerimeter方法。