In Go, when dealing with multiple interfaces with the same method signature but defined in separate packages, situations may arise where a type implementing both interfaces leads to unexpected behavior.
Consider these two interfaces (Doer) and functions (FuncA and FuncB) defined in different packages:
// Package A
type Doer interface { Do() string }
func FuncA(doer Doer)
// Package B
type Doer interface { Do() string }
func FuncB(doer Doer)
If a type C implements Doer from both packages and the implementation differs:
// Package main
type C int
func (c C) Do() string { return "A-specific implementation" }
func main() {
cA := C(0); A.FuncA(cA)
cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations
}
To address this issue, Go's type system emphasizes matching by name and consistency in types. While it allows an object to satisfy multiple interfaces, the implementation of the shared method must adhere to all applicable interface contracts.
In the above scenario, a workaround involves implementing wrapper types:
// Package main
type DoerA struct { C C }
func (d DoerA) Do() string { return "A-specific implementation" }
type DoerB struct { C C }
func (d DoerB) Do() string { return "B-specific implementation" }
func main() {
cA := DoerA{C(0)}; A.FuncA(cA)
cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations
}
By creating these wrappers, you can control the implementation of Do() based on the intended interface usage, ensuring consistency within the respective package contexts.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3