2017-03-07 1 views
0

Dieser Code funktioniert:Aufruf struct Methode

feedService := postgres.FeedService{} 
feeds, err := feedService.GetAllRssFeeds() 

Aber dieser Code gibt mir Fehler:

feeds, err = postgres.FeedService{}.GetAllRssFeeds() 

controllers\feed_controller.go:35: cannot call pointer method on postgres.FeedService literal controllers\feed_controller.go:35: cannot take the address of postgres.FeedService literal

Warum diese beiden Teile des Codes nicht gleich?

Hier ist eine Strukturdeklaration:

type FeedService struct { 

} 

func (s *FeedService) GetAllRssFeeds() ([]*quzx.RssFeed, error) { 
+0

"Warum diese zwei Teile des Codes nicht gleich sind?" weil die Sprachspezifikation das sagt. Die Fehlermeldung ist ziemlich selbsterklärend, oder? – Volker

Antwort

4

Ihre FeedService.GetAllRssFeeds() Methode Zeiger-Empfänger hat, so ein Zeiger auf FeedService erforderlich, um dieses Verfahren zu nennen.

In Ihrem ersten Beispiel verwenden Sie eine short variable declaration, um einen Strukturwert FeedService in einer lokalen Variablen zu speichern. Lokale Variablen sind addressable. Wenn Sie danach feedService.GetAllRssFeeds() schreiben, nimmt der Compiler automatisch die Adresse feedService und verwendet diese als Empfängerwert. Es ist eine Abkürzung für:

feeds, err := (&feedService).GetAllRssFeeds() 

es in Spec: Calls:

If x is addressable and &x 's method set contains m , x.m() is shorthand for (&x).m() .

In Ihrem zweiten Beispiel ist, dass Sie nicht über eine lokale Variable erstellen, verwenden Sie einfach eine Struktur composite literal, aber für sich allein ist es nicht (automatisch) adressierbar, so dass der Compiler keinen Zeiger auf den Wert FeedService erhalten kann, der als Empfänger verwendet werden soll, und daher die Methode nicht aufrufen kann.

Beachten Sie, dass es erlaubt ist, die Adresse eines Verbund wörtlichen ausdrücklich, zu ergreifen, damit auch die folgenden Werke:

feeds, err := (&postgres.FeedService{}).GetAllRssFeeds() 

Dies ist in Spec: Composite literals:

Taking the address of a composite literal generates a pointer to a unique variable initialized with the literal's value.

Siehe Fragen:

What is the method set of `sync.WaitGroup`?

Calling a method with a pointer receiver by an object instead of a pointer to it?