gpt4 book ai didi

go - 调用 struct literal 的方法

转载 作者:IT王子 更新时间:2023-10-29 02:29:22 26 4
gpt4 key购买 nike

这段代码工作正常:

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

但是这段代码给我错误:

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

controllers\feed_controller.go:35: cannot call pointer method on postgres.FeedService literal controllers\feed_controller.go:35: cannot take the address of postgres.FeedService literal

为什么这两段代码不相等?

这是一个结构声明:

type FeedService struct {

}

func (s *FeedService) GetAllRssFeeds() ([]*quzx.RssFeed, error) {

最佳答案

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

在您的第一个示例中,您使用了 short variable declarationFeedService 结构值存储在局部变量中。局部变量是 addressable ,所以当你在那之后编写 feedService.GetAllRssFeeds() 时,编译器会自动获取 feedService 的地址并将其用作接收值。它是以下内容的简写:

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

它在 Spec: Calls:

If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().

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

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

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

这是在Spec: Composite literals:

Taking the address of a composite literal generates a pointer to a unique variable initialized with the literal's value.

查看相关问题:

What is the method set of `sync.WaitGroup`?

Calling a method with a pointer receiver by an object instead of a pointer to it?

关于go - 调用 struct literal 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42643765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com