explain in details why to return struct type in interface constructor
diff --git a/CodeReviewComments.md b/CodeReviewComments.md
index 9f4e05e..d6a9c70 100644
--- a/CodeReviewComments.md
+++ b/CodeReviewComments.md
@@ -351,7 +351,8 @@
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 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