Go語言學習筆記 - PART9 - 介面

小羅希冀發表於2019-05-04

Go語言不是傳統的物件導向程式語言,沒有類和繼承的概念,但是有非常靈活的介面,可以實現物件導向的特徵,介面提供一種方式來說明物件的行為

定義介面

    type Namer interface {
        Method1(param_list) return_type
        Method2(param_list) return_type
        ...
    }
複製程式碼

介面命名方式

  • 方法名 + er字尾(介面只有一個方法的時候)
  • 介面以able結尾
  • 以大寫字母I開頭

介面實現規則

  • 介面可以被隱式實現,多個型別可以實現同一個介面
  • 實現介面的某個型別還可以有其他的方法
  • 一個型別可以實現多個介面
    // 1. 定義一個介面
    type Shaper interface {
    	Area() float32
    }
    
    type Square struct {
    	side float32
    }
    
    // 2. Square型別指標實現介面中的方法
    func (sq *Square) Area() float32 {
    	return sq.side * sq.side
    }
    
    type Rectangle struct {
    	length, width float32
    }
    
    // 3. Rectangle型別實現介面中的方法
    func (r Rectangle) Area() float32 {
    	return r.length * r.width
    }
    
    func main() {
    
    	r := Rectangle{5, 3} 
    	q := &Square{5}
    	// 4. 通過介面陣列接收兩個變數
    	shapes := []Shaper{r, q}
    	fmt.Println("Looping through shapes for area ...")
    	for n, _ := range shapes {
    		fmt.Println("Shape details: ", shapes[n])
    		// 5. 實現多型
    		fmt.Println("Area of this shape is: ", shapes[n].Area())
    	}
    }
複製程式碼

介面巢狀

  • 一個介面可以包含多個介面,相當於將內嵌介面的方法列舉在外層介面
    // 1. 定義介面ReadWrite和Lock
    type ReadWrite interface{
        Read(b Buffer) bool
        Write(b Buffer) bool
    }
    type Lock integer{
        Lock()
        Unlock()
    }
    // 2. 在介面中新增了兩個匿名欄位:ReadWrite和Lock,實現介面巢狀
    type File interface{
        ReadWrite
        Lock
        Close()
    }
複製程式碼

介面變數型別斷言

介面型別變數可以包含任何型別的值,所以需要在執行時檢測變數中儲存的值的實際型別

    t := varI.(T)
    // 或者可以使用下面這種方式
    if t, ok := varI.(T); ok {
        Process(t)
        return
    }
複製程式碼

varI必須是一個介面型別變數

型別判斷(type - switch)

介面變數的型別也可以使用switch來檢測

    switch t := areaIntf.(type) {
    case *Square:
    	fmt.Printf("Type Square %T with value %v\n", t, t)
    case *Circle:
    	fmt.Printf("Type Circle %T with value %v\n", t, t)
    case nil:
    	fmt.Printf("nil value: nothing to check?\n")
    default:
    	fmt.Printf("Unexpected type %T\n", t)
    }
複製程式碼

type - switch中不允許有fallthrough

介面方法集呼叫規則

  • 類*T可呼叫方法集包括接收者為*T和T的所有方法集
  • 型別T的可呼叫方法集包含接收者T的所有方法,但不包含接收者為*T的方法

空介面

    type Any interface{}
複製程式碼
  • 空介面是不包含任何方法的介面
  • 任何型別的值都可以賦值給空介面型別變數

入門教程推薦: github.com/Unknwon/the…

相關文章