我想創建一個界面,以便輕鬆添加新的存儲後端。golang API接口,我錯過了什麼?
package main
// Storage is an interface to describe storage backends
type Storage interface {
New() (newStorage Storage)
}
// File is a type of storage that satisfies the interface Storage
type File struct {
}
// New returns a new File
func (File) New() (newFile Storage) {
newFile = File{}
return newFile
}
// S3 is a type of storage that satisfies the interface Storage
type S3 struct {
}
// New returns a new S3
func (S3) New() (newS3 S3) {
newS3 = S3{}
return newS3
}
func main() {
// List of backends to choose from
var myStorage map[string]Storage
myStorage["file"] = File{}
myStorage["s3"] = S3{}
// Using one of the backends on demand
myStorage["file"].New()
myStorage["s3"].New()
}
但似乎無法定義,滿足應該返回滿足接口本身以及對象的功能。
File.New()返回滿足存儲的Storage類型的對象。
S3.New()返回S3類型的對象。 S3應該滿足接口存儲很好,但我得到這個:
./main.go:32: cannot use S3 literal (type S3) as type Storage in assignment:
S3 does not implement Storage (wrong type for New method)
have New() S3
want New() Storage
我在做什麼錯? 我希望我缺少一些基本的東西。
S3的結構和文件結構有diferent返回obj類型,儘量讓他們都通過使用接口作爲回報返還相同種類的obj。並且在將struct作爲接口返回時不要忘記使用指針。 – Kebeng
Go沒有協變性。 –
@Kebeng我不介意在這裏得到一個對象的副本,所以指針是沒有必要的。並且讓它們成爲「同一類型」就是關鍵。 – xxorde