explain in details why to return struct type in interface constructor

Eslam Mahmoud 2019-07-22 13:53:29 -05:00
parent 956b489bc7
commit b61e691f20

@ -351,7 +351,8 @@ Go interfaces generally belong in the package that uses values of the
interface type, not the package that implements those values. The
implementing package should return concrete (usually pointer or struct)
types: that way, new methods can be added to implementations without
requiring extensive refactoring.
requiring extensive refactoring, and this will enable the struct to implement
more than one interface and be accepted/evaluated to all of them in different functions
Do not define interfaces on the implementor side of an API "for mocking";
instead, design the API so that it can be tested using the public API of
@ -400,6 +401,32 @@ func (t Thinger) Thing() bool { … }
func NewThinger() Thinger { return Thinger{ … } }
```
```go
// DONOT DO THIS
package main
import ("io")
type Thinger interface {
Thing() bool
}
type defaultThinger struct{ }
func (t defaultThinger) Thing() bool {
return true
}
func (t defaultThinger) Read(p []byte) (n int, err error) {
return 0, nil
}
func NewThinger() Thinger {
return defaultThinger{ }
}
func main() {
testThinger(NewThinger())
// will return cannot use NewThinger() (type Thinger) as type io.Reader in argument to testReader: Thinger does not implement io.Reader (missing Read method)
// if NewThinger() return defaultThinger it will work
testReader(NewThinger())
}
func testReader(r io.Reader) {}
func testThinger(t Thinger) {}
```
## Line Length