MST

星途 面试题库

面试题:Go自定义类型方法集与接口实现的扩展关系

定义一个接口 `NumberOperation`,包含方法 `Add`,接受一个同类型参数并返回相加后的结果。定义一个自定义类型 `MyFloat` 为 `float64` 类型。为 `MyFloat` 的指针类型实现 `NumberOperation` 接口的 `Add` 方法。思考并说明如果只为 `MyFloat` 值类型实现 `Add` 方法,在使用接口时会有什么不同表现?
44.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import "fmt"

// 定义接口
type NumberOperation interface {
    Add(other interface{}) interface{}
}

// 定义自定义类型
type MyFloat float64

// 为MyFloat指针类型实现NumberOperation接口的Add方法
func (m *MyFloat) Add(other interface{}) interface{} {
    if v, ok := other.(MyFloat); ok {
        *m = *m + v
        return *m
    }
    return nil
}

// 为MyFloat值类型实现Add方法(这里仅作对比定义)
func (m MyFloat) AddValue(other interface{}) interface{} {
    if v, ok := other.(MyFloat); ok {
        return m + v
    }
    return nil
}

如果只为 MyFloat 值类型实现 Add 方法,在使用接口时:

  • 当接口类型的变量持有 MyFloat 值类型实例时,可以正常调用 Add 方法,但是这种方式不会改变原始值,因为值类型传递是拷贝传递。
  • 当接口类型的变量持有 MyFloat 指针类型实例时,由于没有为指针类型实现接口方法,会导致编译错误,无法调用 Add 方法。而给指针类型实现接口方法,调用时可以直接修改原始值,因为指针传递是引用传递。