繁体   English   中英

调用结构文字的方法

[英]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()

这是规范:复合文字:

获取复合文字的地址会生成一个指针,该指针指向使用该文字的值初始化的唯一变量

查看相关问题:

`sync.WaitGroup` 的方法集是什么?

通过对象而不是指向它的指针调用带有指针接收器的方法?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM