【问题标题】:Call struct method调用结构体方法
【发布时间】:2017-07-27 09:26:49
【问题描述】:

这段代码运行良好:

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

【问题讨论】:

  • "为什么这两段代码不相等?"因为语言规范是这么说的。错误消息是不言自明的,或者?

标签: go


【解决方案1】:

您的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,但它本身不是(自动)可寻址的,因此编译器无法获得指向 FeedService 值的指针用作接收者,因此无法调用该方法。

请注意,允许显式获取复合文字的地址,因此以下方法也有效:

feeds, err := (&postgres.FeedService{}).GetAllRssFeeds()

这是Spec: Composite literals:

复合文字的Taking the address 生成一个指向唯一variable 的指针,该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?

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2020-04-10
    • 1970-01-01
    相关资源
    最近更新 更多