面试题答案
一键面试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
方法。而给指针类型实现接口方法,调用时可以直接修改原始值,因为指针传递是引用传递。