调用struct方法

时间:2017-03-07 08:46:49

标签: go

此代码可以正常工作:

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) {

1 个答案:

答案 0 :(得分:4)

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

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

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

位于Spec: Calls:

  

如果x可以寻址并且&x的方法集包含m,则x.m()(&x).m()的简写。

在你的第二个例子中,你不创建一个局部变量,你只需要使用一个结构composite literal,但它本身不是(自动)可寻址的,所以编译器无法获得指向{{ 1}}值用作接收者,因此不能调用该方法。

请注意,允许明确地使用复合文字的地址,因此以下内容也适用:

FeedService

这是Spec: Composite literals:

  复合文字的

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?