星期二, 5月 04, 2021

[Go] interface 使用


interface是介面的定義。
就像是,如果我有用兩套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:  }  

沒有留言: