服务依赖作为指针与值
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"
仍会传播到范围之外。
如果您从性能的角度来看它,您不应该为通过引用传递而烦恼,除非您经常这样做并且您的结构非常大。由于传递我的值可以由编译器优化为仅使用堆栈,而按值传递将始终创建堆分配。一般来说,你不应该担心这个,除非分析表明你应该。
当我在 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"
仍会传播到范围之外。
如果您从性能的角度来看它,您不应该为通过引用传递而烦恼,除非您经常这样做并且您的结构非常大。由于传递我的值可以由编译器优化为仅使用堆栈,而按值传递将始终创建堆分配。一般来说,你不应该担心这个,除非分析表明你应该。