接口/類型斷言(二)
阿新 • • 發佈:2019-01-28
inter imp ems clas unknown 但是 不知道 unlock 嵌套 1.定義
Interface類型可以定義一組方法,但是這些不需要實現。並且interface不能包含任何變量。
比如: b. 如果一個變量含有了多個interface類型的方法,那麽這個變量就實現了多個接口。
c. 如果一個變量只含有了1個interface的方部分方法,那麽這個變量沒有實現這個接口。
4.多態
一種事物的多種形態,都可以按照統一的接口進行操作
5.接口嵌套
一個接口可以嵌套在另外的接口,如下所示:
Interface類型可以定義一組方法,但是這些不需要實現。並且interface不能包含任何變量。
比如:
type example interface{
Method1(參數列表) 返回值列表
Method2(參數列表) 返回值列表
…
}
2.interface類型默認是一個指針
type example interface{
Method1(參數列表) 返回值列表
Method2(參數列表) 返回值列表
…
}
var a example
a.Method1()
3.接口實現
a. Golang中的接口,不需要顯示的實現。只要一個變量,含有接口類型中的所有方法,那麽這個變量就實現這個接口。因此,golang中沒有implement類似的關鍵字
c. 如果一個變量只含有了1個interface的方部分方法,那麽這個變量沒有實現這個接口。
4.多態
一種事物的多種形態,都可以按照統一的接口進行操作
5.接口嵌套
一個接口可以嵌套在另外的接口,如下所示:
type ReadWrite interface { Read(b Buffer) bool Write(b Buffer) bool } type Lock interface { Lock() Unlock() } type File interface { ReadWrite Lock Close() }
- 類型斷言,由於接口是一般類型,不知道具體類型,如果要轉成具體類型可以采用以下方法進行轉換:
var t int
var x interface{}
x = t
y = x.(int) //轉成int
var t int
var x interface{}
x = t
y, ok = x.(int) //轉成int,帶檢查
7.練習,寫一個函數判斷傳入參數的類型
func classifier(items ...interface{}) { for i, x := range items { switch x.(type) { case bool: fmt.Printf(“param #%d is a bool\n”, i) case float64: fmt.Printf(“param #%d is a float64\n”, i) case int, int64: fmt.Printf(“param #%d is an int\n”, i) case nil: fmt.Printf(“param #%d is nil\n”, i) case string: fmt.Printf(“param #%d is a string\n”, i) default: fmt.Printf(“param #%d’s type is unknown\n”, i) } }
8.類型斷言,采用type 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 float32: fmt.Printf(“Type float32 with value %v\n”, t)case nil: fmt.Println(“nil value: nothing to check?”)
default: fmt.Printf(“Unexpected type %T”, t)}
9.空接口,Interface{}
空接口沒有任何方法,所以所有類型都實現了空接口。
var a int
var b interface{}
b = a
10.判斷一個變量是否實現了指定接口
判斷一個變量是否實現了指定接口
type Stringer interface {
String() string
}
var v MyStruct
if sv, ok := v.(Stringer); ok {
fmt.Printf(“v implements String(): %s\n”, sv.String());
}
接口/類型斷言(二)