我的應用程序中有一個單例,但它不是直接作為結構發布,而是作為接口發布(因為我希望能夠在單例初始化時動態選擇特定的實現)。這是代碼:var once sync.Oncevar instance defaultConfigurationtype Configuration interface { GetFoo() string}type defaultConfiguration struct {}func (dc defaultConfiguration) GetFoo() string { return "foo"}func NewConfiguration() Configuration { once.Do(func() { instance = defaultConfiguration{} }) return instance}然后我決定編寫一個單元測試來檢查NewConfiguration()每次是否實際返回相同的實例:func TestNewConfigurationSameInstance(t *testing.T) { configuration1 := NewConfiguration() configuration2 := NewConfiguration() if &configuration1 != &configuration2 { t.Error() }}我認為比較返回實例的地址是有意義的,但是,這個測試失敗了。然后我想,好吧,也許我必須返回一個指向實例的指針,所以我將代碼更改為如下所示:func NewConfiguration() *Configuration { once.Do(func() { instance = defaultConfiguration{} }) return &instance}但這甚至無法編譯:它失敗并顯示錯誤消息不能使用 &instance (type *defaultConfiguration) 作為類型 *Configuration 在返回參數中: *Configuration 是指向接口的指針,而不是接口我很困惑。為什么我不能返回指向接口的指針?或者,為什么按原樣返回defaultConfiguration是Configuration有效的,但*defaultConfiguration按原樣返回*Configuration不是?畢竟,什么是適合我的用例的單元測試?
1 回答
HUX布斯
TA貢獻1876條經驗 獲得超6個贊
您的代碼應該是:
var once sync.Once
var instance *defaultConfiguration
type Configuration interface {
GetFoo() string
}
type defaultConfiguration struct {
}
func (dc *defaultConfiguration) GetFoo() string {
return "foo"
}
func NewConfiguration() Configuration {
once.Do(func() {
instance = &defaultConfiguration{}
})
return instance
}
因為Configuration是一個接口,你想要一個指針defaultConfiguration來實現它。
*Configuration很少需要指向接口的指針(例如)。一個接口已經是一個引用值,一個指向某種類型的指針來實現一個接口是完全沒問題的。
有關根本問題的更多背景信息,請閱讀此答案或類似資源。
- 1 回答
- 0 關注
- 160 瀏覽
添加回答
舉報
0/150
提交
取消
