服务依赖作为指针与值

Service dependencies as pointer vs value

当我在 Golang 中创建服务时,像这样

    s := &service.Service{
        Persister:                       persister,
        OrderStore:                      orderStore,
        Publisher:                       publisher,
        Config:                          serviceConfig,
        Log:                             log,
    }

我可以选择通过指针或值传递依赖项。选择哪个比较好?

这完全取决于你想做什么。

如果按值传递,您将创建该结构的副本。这意味着如果您将相同的服务传递给 2 个不同的函数,并且 1 个函数发生更改,例如 s.Publisher (s.Publisher = newPublisher()),更改将不会超出更改它的函数的范围。但是请记住,由于您的结构的字段本身可能是指针,因此更改为 s.Publisher.something = "something else" 仍会传播到范围之外。

如果您从性能的角度来看它,您不应该为通过引用传递而烦恼,除非您经常这样做并且您的结构非常大。由于传递我的值可以由编译器优化为仅使用堆栈,而按值传递将始终创建堆分配。一般来说,你不应该担心这个,除非分析表明你应该。