这段代码可以正常工作:
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 declaration将FeedService
结构值存储在局部变量中。局部变量是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/