Наткнулся на следующие отличия реализации функций. Каковы причины, по которым Пример 1 возвращает указатель, а Пример 2 возвращает фактический объект?
type MyInterface interface {
Func (param int) float64 //just random signature
}
//MyInterfaceImpl implements MyInterface
type MyInterfaceImpl struct {
}
//actual implementation
func (myObj *MyInterfaceImpl) Func(param int) float64 {
return float64(param)
}
Пример 1: указатель на MyInterfaceImpl
возвращается, когда функция возвращает интерфейс
func NewMyInterface() MyInterface {
return &MyInterfaceImpl{}
}
Пример 2: фактический объект MyInterfaceImpl
возвращается, когда функция возвращает объект
func NewMyInterfaceImpl() MyInterfaceImpl {
return MyInterfaceImpl{}
}
ОБНОВЛЕНИЕ: Этот фрагмент кода компилируется и запускается
func main() {
myIf := NewMyInterface()
fmt.Printf("Hi from inteface %f\n", myIf.Func(1000))
myImpl := NewMyInterfaceImpl()
fmt.Printf("Hi from impl %f\n", myImpl.Func(100))
}
ОБНОВЛЕНИЕ2: Уточнение вопроса.
Звучит странно (для меня) иметь объявление func NewMyInterface() MyInterface
и правильную реализацию return &MyInterfaceImpl{}
, где возвращается указатель. Я ожидал бы вернуть объект MyInterfaceImpl с return MyInterfaceImpl{}
Если язык допускает подобные типы конструкций, для этого должна быть причина. В конце концов, я ищу следующий ответ: «Объявление функции возвращает интерфейс. Поскольку интерфейс имеет свойство X, возвращать объект не имеет смысла, но единственная допустимая опция - указатель».