这段代码可以正常工作:

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

但是这段代码给了我错误:
feeds, err = postgres.FeedService{}.GetAllRssFeeds()



为什么这两段代码不相等?

这是一个结构声明:
type FeedService struct {

}

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

最佳答案

您的FeedService.GetAllRssFeeds()方法具有指针接收器,因此需要指向FeedService的指针才能调用此方法。

在第一个示例中,您使用short variable declarationFeedService结构值存储在局部变量中。局部变量是addressable,因此在此之后编写feedService.GetAllRssFeeds()时,编译器将自动获取feedService的地址并将其用作接收器值。它是以下各项的简写:

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

Spec: Calls:



在第二个示例中,您没有创建局部变量,只使用了一个结构composite literal,但是它本身(不可自动)寻址,因此编译器无法获得指向FeedService值的指针用作接收器,因此无法调用该方法。

请注意,它允许显式采用复合文字的地址,因此以下内容也适用:
feeds, err := (&postgres.FeedService{}).GetAllRssFeeds()

这是在Spec: Composite literals:



查看相关问题:

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

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

关于go - 调用struct方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42643765/

10-13 08:39