仲間の開発者各位
私には少し奇妙に思えるこの問題があります。次のコードスニペットをご覧ください。
package coreinterfaces
type FilterInterface interface {
Filter(s *string) bool
}
type FieldFilter struct {
Key string
Val string
}
func (ff *FieldFilter) Filter(s *string) bool {
// Some code
}
type FilterMapInterface interface {
AddFilter(f *FilterInterface) uuid.UUID
RemoveFilter(i uuid.UUID)
GetFilterByID(i uuid.UUID) *FilterInterface
}
type FilterMap struct {
mutex sync.Mutex
Filters map[uuid.UUID]FilterInterface
}
func (fp *FilterMap) AddFilter(f *FilterInterface) uuid.UUID {
// Some code
}
func (fp *FilterMap) RemoveFilter(i uuid.UUID) {
// Some code
}
func (fp *FilterMap) GetFilterByID(i uuid.UUID) *FilterInterface {
// Some code
}
他のいくつかのパッケージでは、次のコードがあります。
func DoFilter() {
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(fieldfilter) // <--- Exception is raised here
}
ランタイムは上記の行を受け入れません。
「fieldint.AddFilterへの引数で* coreinterfaces.FilterInterfaceタイプとしてフィールドフィルター(* coreinterfaces.FieldFilterタイプ)を使用することはできません:* coreinterfaces.FilterInterfaceは、インターフェイスではなくインターフェイスへのポインターです」
ただし、コードを次のように変更すると、
func DoBid() error {
bs := string(b)
var ifilterfield coreinterfaces.FilterInterface
fieldfilter := &coreinterfaces.FieldFilter{Key: "app", Val: "152511"}
ifilterfield = fieldfilter
filtermap := &coreinterfaces.FilterMap{}
_ = filtermap.AddFilter(&ifilterfield)
}
すべてが大丈夫であり、アプリケーションをデバッグするとき、それは本当に含むようです
私はこのトピックについて少し混乱しています。他のブログの記事を見て、スタックオーバーフロースレッドが(例えば-このまったく同じ問題について議論するとき、この、または これを)この例外を発生させる第一のスニペットは動作する必要があり、fieldfilterとFieldMapの両方がむしろの値より、インターフェースへのポインタとして初期化されるのでインターフェース。FieldInterfaceを宣言せずにそのインターフェースの実装を割り当てないようにするために変更する必要がある、実際にここで発生することについて頭を抱えることができませんでした。これにはエレガントな方法が必要です。
* FilterInterface
このインターフェイスを実装する構造体に変更することで、インターフェイスを関数に渡すという考えを壊します。私が達成したかったことは、渡した構造体にバインドされているのではなく、使用したいインターフェイスを実装するすべての構造体です。あなたがより効率的だと思うかもしれないコードの変更、または私が行うための標準までですか?私はいくつかのコードレビューサービスを使用してうれしいです:)
* FilterInterface
にFilterInterface
ライン_ = filtermap.AddFilter(fieldfilter)
:今これがレイズcoreinterfaces.FieldFilterはcoreinterfaces.FilterInterfaceを実装していない(フィルタメソッドがポインタ受信機を有する):filtermap.AddFilterに引数に型coreinterfaces.FilterInterfaceとして(型coreinterfaces.FieldFilter)fieldfilter使用できない変更する場合が_ = filtermap.AddFilter(&fieldfilter)
それへの行は動作します。そこで何が起こるの?何故ですか?