Может ли метод вернуть указатель с типом возвращаемого значения этого метода: значение

Я видел фрагмент кода, как показано ниже:

Просто интересно, как был реализован метод значения draw(), почему на самом деле он может возвращать указатель структуры.

type Shape interface {
    draw()
}

type Rectangle struct {
}

func (Rectangle) draw() {
    fmt.Println("Draw Rectangle")
}

type Square struct {
}

func (Squre) draw() {
    fmt.Println("Draw Square")
}

type Circle struct {
}

func (Circle) draw() {
    fmt.Println("Draw Circle")
}


type ShapeFactory struct {
}

func (*ShapeFactory) CreateShape(shape string) Shape {
    if shape == "Rectangle" {
        return &Rectangle{}
    } else if shape == "Square" {
        return &Square{}
    } else if shape == "Circle" {
        return &Circle{}
    }
    return nil

}

Я думаю, должно ли быть так, как показано ниже, чтобы реализовать метод указателя, чтобы метод CreateShape мог возвращать указатель структуры?

type Rectangle struct {
}

func (*Rectangle) draw() {
    fmt.Println("Draw Rectangle")
}

person s666    schedule 12.07.2021    source источник
comment
обратитесь к этому примеру interfaces.   -  person nipuna    schedule 12.07.2021
comment
Тип Shape является типом интерфейса, а не типом структуры. Типы *Rectangle, *Square и *Circle реализуют интерфейс Shape, поэтому они могут быть возвращены этим методом.   -  person mkopriva    schedule 12.07.2021


Ответы (1)


Тип возвращаемого значения, определенный в методе CreateShape, является не структурой, а интерфейсом. Следовательно, CreateShape может возвращать любой тип, если он реализует интерфейс Shape.

person Gregor Zurowski    schedule 12.07.2021
comment
привет, я отредактировал свой вопрос, я хотел бы знать, почему код может работать только с реализацией метода значения, но возвращать указатель? Спасибо, в любом случае. - person s666; 12.07.2021
comment
Неважно, возвращаете ли вы указатель или значение, если они соответствуют тому, что определено интерфейсом. Также просмотрите stackoverflow.com/questions/27178635/. - person Gregor Zurowski; 12.07.2021
comment
@s666 См. наборы методов, особенно следующие: Набор методов любого другого типа T состоит из всех методов, объявленных с типом приемника T. Набор методов соответствующего типа указателя *T представляет собой набор всех методов, объявленных с приемником *T или T (то есть он также содержит набор методов T). - person mkopriva; 12.07.2021
comment
@ s666, но имейте в виду, что обратное неверно верно, то есть методы, объявленные с получателем *T, не являются частью набора методов T. - person mkopriva; 12.07.2021