interface method 返回 interface 如何實現?
需求來自於 https://github.com/teambition/ratelimiter-go 這個庫,它是基於 redis 實現的介面速率控制。
當前的實現會顯示的依賴 "gopkg.in/redis.v5" ,我希望去掉這個顯示的依賴,通過 interface 來定義需要的 redis 介面,從而可以支援 v3, v4, v5 等不同的版本,甚至其它 redis 實現(只要實現了定義的 interface)。
目前存在的問題就是 interface method 返回 interface
的問題:
type redisResult interface {
Result() (interface{}, error)
}
type baseRedisClient interface {
Del(...string) redisResult
ScriptLoad(string) redisResult
EvalSha(string, []string, ...interface{}) redisResult
}
具體程式碼詳見 https://github.com/teambition/ratelimiter-go/blob/dev/ratelimiter.go#L36
這個目前會報錯:
➜ ratelimiter-go git:(dev) go test
# github.com/teambition/ratelimiter-go_test
./example_test.go:19: cannot use client (type *redis.Client) as type ratelimiter.redisClient in argument to ratelimiter.New:
*redis.Client does not implement ratelimiter.redisClient (wrong type for Del method)
have Del(...string) *redis.IntCmd
want Del(...string) ratelimiter.redisResult
...
google 了一把,有這樣一個答案:How to implement interface method with return type is an interface in Golang ,但這個解決不了我的需求,因為它要修改 method 實現方的程式碼。
最終放棄了上面這種實現方式,而是由使用者來實現 RedisClient interface,通過這種方式來支援不同版本不同實現的 redis client。
type RedisClient interface {
RateDel(string) error
RateEvalSha(string, []string, ...interface{}) (interface{}, error)
RateScriptLoad(string) (string, error)
}
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- Go interface實現分析Go
- gomock: 不依賴interface{}的stuct method mockGoMock
- GO 學習筆記 (三) : method 和 interfaceGo筆記
- 如何理解 interface 介面
- Go語言interface底層實現Go
- JavaScript設計模式--實現介面InterfaceJavaScript設計模式
- abstract 的 interface ,如何理解?
- interface/介面
- golang使用sqlx報錯:unsupported type []interface {}, a slice of interfaceGolangSQL
- Golang之interfaceGolang
- C#--interfaceC#
- Castor和interfaceAST
- Interface中加Static
- 【Golang】Go 通過結構(struct) 實現介面(interface)GolangStruct
- 如何處理SAP CRM Web Service錯誤 - Virtual Interface Method XXXX not supportedWeb
- public interface View介面和public interface ViewResolver介面介紹View
- Golang | Go語言多型的實現與interface使用Golang多型
- Java-介面(interface)Java
- golang interface淺談Golang
- java基礎:interfaceJava
- java之介面interfaceJava
- C#介面interfaceC#
- c# interface介面C#
- firewalld: 介面interface操作
- java中的interface(介面)Java
- Oracle Payment Interface安裝Oracle
- Go語言中的InterfaceGo
- C# interface abstract classC#
- go interface 的筆記Go筆記
- 【SQLServer】The provider supports the interfaceSQLServerIDE
- Oracle Applications Interface ProgramsOracleAPP
- c# interface介面之C#
- Oracle wait interface -- sessionOracleAISession
- Oracle, History and the Wait InterfaceOracleAI
- Program Interface Structure (135)Struct
- Shooter Game User Interface StarterGAM
- 使用 Java Native Interface 的最佳實踐Java
- struct 和 interface:結構體與介面都實現了哪些功能?Struct結構體