동료 개발자 여러분,
나에게 조금 이상해 보이는 문제가 있습니다. 이 코드 스 니펫을 살펴보십시오.
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 유형으로 fieldfilter (유형 * 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)
}
모든 것이 정상이며 응용 프로그램을 디버깅 할 때 실제로 포함되는 것 같습니다.
이 주제에 대해 약간 혼란 스럽습니다. 이 동일한 문제를 논의 다른 블로그 게시물 및 스택 오버플로 스레드를 볼 때 (예 - 이 , 또는 이 ) fieldmap fieldfilter 모두가 인터페이스 포인터로 초기화되기 때문에 오히려 값보다,이 예외가 작동합니다 제기 최초의 조각 인터페이스. FieldInterface를 선언하지 않고 해당 인터페이스에 대한 구현을 할당하지 않도록 변경해야하는 여기서 실제로 발생하는 일에 대해 머리를 감쌀 수 없었습니다. 이를위한 우아한 방법이 있어야합니다.
* FilterInterface
이 인터페이스를 구현하는 구조체 로 변경하면 인터페이스를 함수로 전달하는 아이디어가 깨집니다. 내가 내가 통과 있었는지 구조체에 결합되지 않는 달성하고 싶었지만 오히려 모든 구현은 내가 관심 인터페이스가 사용하는 것을 구조체. 코드 변경이 더 효율적이라고 생각하거나 제가 수행 할 수있는 표준에 부합한다고 생각하십니까? 코드 리뷰 서비스를 사용하게되어 기쁩니다. :)
* FilterInterface
에FilterInterface
선_ = filtermap.AddFilter(fieldfilter)
지금이 제기 coreinterfaces.FieldFilter가 coreinterfaces.FilterInterface를 구현하지 않습니다 (필터 방법은 포인터 수신기를 가지고) : filtermap.AddFilter에 인수 형 coreinterfaces.FilterInterface로 (유형 coreinterfaces.FieldFilter) fieldfilter 사용할 수 없습니다 을 변경하는 경우에는 라인이_ = filtermap.AddFilter(&fieldfilter)
작동합니다. 여기서 무슨 일이 일어나나요? 왜 그런 겁니까?