此代码可以正常工作:
feedService := postgres.FeedService{}
feeds, err := feedService.GetAllRssFeeds()
但是这段代码给了我错误:
feeds, err = postgres.FeedService{}.GetAllRssFeeds()
controllers \ feed_controller.go:35:无法调用指针方法 postgres.FeedService文字控制器\ feed_controller.go:35:不能 获取postgres.FeedService文字的地址
为什么这两段代码不相等?
这是一个结构声明:
type FeedService struct {
}
func (s *FeedService) GetAllRssFeeds() ([]*quzx.RssFeed, error) {
答案 0 :(得分:4)
您的FeedService.GetAllRssFeeds()
方法有指针接收器,因此调用此方法需要指向FeedService
的指针。
在第一个示例中,您使用short variable declaration将FeedService
结构值存储在局部变量中。局部变量为addressable,因此在此之后编写feedService.GetAllRssFeeds()
时,编译器将自动获取feedService
的地址并将其用作接收器值。这是一个简写:
feeds, err := (&feedService).GetAllRssFeeds()
如果
x
可以寻址并且&x
的方法集包含m
,则x.m()
是(&x).m()
的简写。
在你的第二个例子中,你不创建一个局部变量,你只需要使用一个结构composite literal,但它本身不是(自动)可寻址的,所以编译器无法获得指向{{ 1}}值用作接收者,因此不能调用该方法。
请注意,允许明确地使用复合文字的地址,因此以下内容也适用:
FeedService
复合文字的Taking the address会生成指向使用文字值初始化的唯一variable的指针。
参见相关问题:
What is the method set of `sync.WaitGroup`?
Calling a method with a pointer receiver by an object instead of a pointer to it?