就像是,如果我有用兩套database,但要用同一個接口,底下的實作再各自做,
這樣我們就定這接口是interface,他可以讓不同的東西來call他。
我們先定一個interface,裡面有read()和write()兩個function name,
但我們這時還沒實作他。
1: type Database interface {
2: Read()
3: Write()
4: }
這時我們再開始實作裡面真正要做的事,
先定義好MySQL和MongoDB這兩個structure,
然後再定義read()和write()這兩個function分別給MySQL和MongoDB
func (m MySQL) Read()這代表,如果你宣告一個MySQL的structure,你可以直接使用這個
1: // MySQL 會實作 Database 介面。
2: type MySQL struct {
3: num int
4: }
5: func (m MySQL) Read() {
6: fmt.Printf("MYSQL read %d\n", m.num)
7: }
8: func (m MySQL) Write() {
9: fmt.Printf("MYSQL write %d\n", m.num)
10: }
11: // MongoDB 會實作 Database 介面。
12: type MongoDB struct {
13: name string
14: }
15: func (m MongoDB) Read() {
16: fmt.Printf("MongoDB read %s\n", m.name)
17: }
18: func (m MongoDB) Write() {
19: fmt.Printf("MongoDB write %s\n", m.name)
20: }
使用的方式有兩種,第一種是直接宣告一個structure後,直接使用。
1: func main() {
2: S := MySQL{num: 123}
3: S.Read()
4: }
第二種是統一用new的方式,讓new的function自己來判斷。
只要把MySQL或MongoDB傳入new裡面,他就會被實作成Database的介面,
這樣就能直接使用read()和write()。
1: func New(db Database) {
2: db.Read()
3: db.Write()
4: }
5: func main() {
6: New(MySQL{num: 123})
7: New(MongoDB{name: "name"})
8: }
程式碼:
1: package main
2: import (
3: "fmt"
4: )
5: type Database interface {
6: Read()
7: Write()
8: }
9: // MySQL 會實作 Database 介面。
10: type MySQL struct {
11: num int
12: }
13: func (m MySQL) Read() {
14: fmt.Printf("MYSQL read %d\n", m.num)
15: }
16: func (m MySQL) Write() {
17: fmt.Printf("MYSQL write %d\n", m.num)
18: }
19: // MongoDB 會實作 Database 介面。
20: type MongoDB struct {
21: name string
22: }
23: func (m MongoDB) Read() {
24: fmt.Printf("MongoDB read %s\n", m.name)
25: }
26: func (m MongoDB) Write() {
27: fmt.Printf("MongoDB write %s\n", m.name)
28: }
29: func New(db Database) {
30: db.Read()
31: db.Write()
32: }
33: func main() {
34: New(MySQL{num: 123})
35: New(MongoDB{name: "name"})
36: }
沒有留言:
張貼留言