mirror of
https://github.com/alrayyes/wiki.git
synced 2024-11-22 11:36:23 +00:00
47 lines
928 B
Markdown
47 lines
928 B
Markdown
|
---
|
||
|
id: 8f08356d-b0dc-465b-b7f5-5522b5133916
|
||
|
title: Golang Embedding
|
||
|
---
|
||
|
|
||
|
# Description
|
||
|
|
||
|
[Embedding](https://golang.org/doc/effective_go.html#embedding) is Gos
|
||
|
answer to subclasses. There's one caveat:
|
||
|
|
||
|
> There's an important way in which embedding differs from subclassing.
|
||
|
> When we embed a type, the methods of that type become methods of the
|
||
|
> outer type, but when they are invoked the receiver of the method is
|
||
|
> the inner type, not the outer one.
|
||
|
|
||
|
# Interfaces
|
||
|
|
||
|
``` go
|
||
|
type Reader interface {
|
||
|
Read(p []byte) (n int, err error)
|
||
|
}
|
||
|
|
||
|
type Writer interface {
|
||
|
Write(p []byte) (n int, err error)
|
||
|
}
|
||
|
|
||
|
type ReadWriter interface {
|
||
|
Reader
|
||
|
Writer
|
||
|
}
|
||
|
```
|
||
|
|
||
|
`ReadWriter` "extends" `Reader` & `Writer` in the example above.
|
||
|
|
||
|
# Structs
|
||
|
|
||
|
``` go
|
||
|
type ReadWriter struct {
|
||
|
*Reader // *bufio.Reader
|
||
|
*Writer // *bufio.Writer
|
||
|
}
|
||
|
|
||
|
func (rw *ReadWriter) Read(p []byte) (n int, err error) {
|
||
|
return rw.reader.Read(p)
|
||
|
}
|
||
|
```
|