[英]Call struct literal's method
此代码工作正常:
feedService := postgres.FeedService{}
feeds, err := feedService.GetAllRssFeeds()
但是这段代码给了我错误:
feeds, err = postgres.FeedService{}.GetAllRssFeeds()
controllers\feed_controller.go:35: 不能在 postgres.FeedService 文字上调用指针方法 controllers\feed_controller.go:35: 不能获取 postgres.FeedService 文字的地址
为什么这两条代码不相等?
这是一个结构声明:
type FeedService struct {
}
func (s *FeedService) GetAllRssFeeds() ([]*quzx.RssFeed, error) {
您的FeedService.GetAllRssFeeds()
方法具有指针接收器,因此需要指向FeedService
的指针才能调用此方法。
在您的第一个示例中,您使用简短的变量声明将FeedService
结构值存储在局部变量中。 局部变量是可寻址的,所以当你写feedService.GetAllRssFeeds()
之后,编译器会自动获取feedService
的地址并将其用作接收器值。 它是以下的简写:
feeds, err := (&feedService).GetAllRssFeeds()
它在规格中:调用:
如果
x
是可寻址的并且&x
的方法集包含m
,则xm()
是(&x).m()
的简写。
在第二个示例中,您不创建局部变量,只使用 struct复合文字,但它本身不是(自动)可寻址的,因此编译器无法获取指向FeedService
值的指针以用作接收器,并且因此无法调用该方法。
请注意,允许显式获取复合文字的地址,因此以下方法也有效:
feeds, err := (&postgres.FeedService{}).GetAllRssFeeds()
这是规范:复合文字:
查看相关问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.