Разница в реализации функции при создании экземпляра объекта с разными сигнатурами функций - PullRequest
0 голосов
/ 09 марта 2019

Наткнулся на следующие отличия реализации функций. Каковы причины, по которым Пример 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, возвращать объект не имеет смысла, но единственная допустимая опция - указатель».

1 Ответ

1 голос
/ 09 марта 2019

Несмотря на то, что я не уверен, о какой части кода идет речь, позвольте мне объяснить, что делает код:

MyInterface реализуется всем, что имеет метод Func(int)float64.
*MyInterfaceImpl имеет такой метод. Однако MyInterfaceImpl нет (метод имеет приемник указателя).

NewMyInterface(), таким образом, должен возвращать указатель. MyInterfaceImpl{} не реализует MyInterface.

Это отвечает на ваш вопрос?


Другой вопрос может заключаться в том, почему вызов myImpl.Func(100) работает, несмотря на вышесказанное Это потому, что Go автоматически получает адрес получателя при вызове его методов с указателями получателей.
Это объясняется более подробно, например, здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...