GitLab:https://gitlab.com/whitefloor40567/golangnote
直接就跳到Interface是太快了...
中間其實還有很多東西需要講,包括設計模式用Interface實驗
不過日後再補上吧XD
Interface在Golang裡的一個使用方法,就是萬用型別
也就是說變數的型態宣告為interface{},將會接收任何形態的變數
下面順便介紹之前switch沒提到的特殊用法
可以值得注意的是在宣告傳入變數時的型態宣告
代表傳入的參數是任何型態都可以接收
package interfacebasic
import "log"
// InterfaceGuide interface可以是任意型態
func InterfaceGuide(ent interface{}) {
//switch的特殊用法,判斷型態
switch ent.(type) {
case int:
log.Println("this type is int")
case string:
log.Println("this type is string")
}
}
interface還可以拿來撰寫多型
就是說方法是固定的,但是實現對象不一樣,就能根據對象產出不一樣的實作方法
或者有固定的流程方法
例如以下的搜尋系統,會固定需要輸入書籍的ISBN碼與書名
package interfacebasic
import "log"
//interface使用方法
// 1.宣吿interface與實現該interface的方法,以及實現interface方法的傳入值&回傳值
// 2.interface的實現對象是struct,所以需要宣告struct
// 3.以struct實作interface方法
// 4.將struct實例傳入interface內,即可運作
// SearchSystem 宣告interface
type SearchSystem interface {
EnterISBN(ISBN int)
EnterBookName(bookname string)
}
// Book 宣告struct
type Book struct {
BookISBN int
BookName string
}
//實作interface的方法如下
// EnterISBN .. 輸入ISBN碼
func (b *Book) EnterISBN(ISBNnum int) {
if b.BookISBN == ISBNnum {
log.Println("BookISBN is ", b.BookISBN)
} else {
log.Println("Enter BookISBN Error")
}
}
// EnterBookName ... 輸入書名
func (b *Book) EnterBookName(bookname string) {
if b.BookName == bookname {
log.Println("BookName is ", b.BookName)
} else {
log.Println("Enter BookName Error")
}
}
// Run ...
func Run(s SearchSystem) {
ISBN := 40666888
Bookname := "War"
s.EnterISBN(ISBN)
s.EnterBookName(Bookname)
}