【问题标题】:Providing Access to package level variable via public getter - How to return the instance?通过公共 getter 提供对包级别变量的访问 - 如何返回实例?
【发布时间】:2021-10-13 23:13:29
【问题描述】:

我有一个在应用程序启动时实例化的包级变量。即使它被声明为包级别,我也需要从包外部访问它。为此,我有一个返回变量的函数。

package app

var myService MyService

type MyService interface {
    DoThis()
    DoThat()
}

func Initialize() {
    
    // initialise other stuff
    myService = initMyService()

}

func GetMyService() MyService {
    return myService
}

现在,在应用程序包之外,当我需要使用 MyService 执行某些操作时,我会执行以下操作。

ms := app.GetMyService()
ms.DoThis()

我有以下问题。

  1. GetMyService() 函数不是在每次调用时都返回 myService 的副本吗?
  2. 如果是这种情况,如果我在该函数中返回指向 myService 的指针,它是否通过返回对最初实例化的单个 myService 实例的引用来解决该问题?

【问题讨论】:

  • 无论哪种方式,GetMyService 都会返回一个将具体值装箱的接口。所以对于客户端代码,它是透明的
  • 但以防万一 - 是的,它对堆栈具有应对价值。
  • @blackgreen 是的,它封装了实际的实现。但它不是每次调用时都将 myService 的副本装箱吗?
  • Go 中没有引用。
  • @Volker 我的意思是指针

标签: go pointers


【解决方案1】:

var myService MyService 这里MyServiceinterface。所以你可以用指针接收器方法或值接收器方法来实现它。

正如 go tour tour.golang.org/methods/8 提到的,

使用指针接收器有两个原因。

第一个是让方法可以修改其接收者的值 指向。

第二个是避免在每个方法调用上复制值。这个可以 如果接收器是大型结构,效率会更高...

如果你用指针接收器方法实现MyService,它不会在每次调用中复制接收器。

请参考golang.org/doc/faqShould I define methods on values or pointers?。对此也有很好的解释。

示例实现如下

type doer struct {
    // any fields   
}

func (d *doer) DoThis() {
    // any implementation
    fmt.Println(`do this`)
}

func (d *doer) DoThat() {
    // any implementation
    fmt.Println(`do that`)
}

func initMyService()  MyService{
    return &doer{
        // init doer fields
    }
}

【讨论】:

  • 使它们成为指针接收器的决定完全取决于函数的实现。不是吗?如果您需要修改接收器函数内部结构中的字段,是的,您必须使它们成为指针接收器。就我而言,假设它只是在控制台上打印一些东西。这些函数不会将字段公开给其他人。在那种情况下,我认为你不必让它们成为指针接收器。
  • 还有一点,如果您的接收器类型不是很大,无法在每个函数调用中复制。正如最后描述的常见问题解答For types such as basic types, slices, and small structs, a value receiver is very cheap so unless the semantics of the method requires a pointer, a value receiver is efficient and clear.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多