go語言中使用介面斷言(type assertions
)將介面轉換成另外乙個介面,也可以將介面轉換為另外的型別。
格式:
i.(t)
。i
表示乙個介面的型別和t
表示乙個型別
斷言的基本格式:
t := i.(t)三種情況:/*i 代表介面變數,t 代表轉換的目標型別,t 代表轉換後的變數
*/
var w io.writerw = os.stdout
f := w.(*os.file) // 成功: f == os.stdout
c := w.(*bytes.buffer) // 宕機:介面儲存*os.file,而不是*bytes.buffer
var w io.writer如果w = os.stdout
rw := w.(io.readwriter) // 成功:*os.file具有讀寫功能
w = new(bytecounter)
rw = w.(io.readwriter) // 宕機:*位元組計數器沒有讀取方法
/*第乙個型別斷言後,w 和 rw 都持有 os.stdout 因此它們每個有乙個動態型別 *os.file,但是變數 w 是乙個 io.writer 型別只對外公開出檔案的 write 方法,然而 rw 變數也只公開它的 read 方法。
*/
i
沒有完全實現t
介面的方法,這個語句將會觸發宕機。可以寫成這樣:
t,ok := i.(t)概念:/*如果發生介面未實現時,將會把 ok 置為 false,t 置為 t 型別的 0 值。
正常實現時,ok 為 true。這裡 ok 可以被認為是:i 介面是否實現 t 型別的結果。
*/
乙個型別同時實現了兩個介面,可以在這兩個介面之間切換
示例**:
package mainimport "fmt"
/* 定義飛行動物介面 */
type flyer inte***ce
/* 定義行走動物介面 */
type walker inte***ce
/* 定義鳥型別 */
type bird struct
/* 定義鳥型別的方法 */
func (b *bird) fly()
func (b *bird) walk()
/* 定義
Go基礎之 介面
在go語言中,乙個類只要實現了介面要求的所有函式,我們就說這個類實現了該介面 inte ce型別可以定義一組方法,用來表示乙個物件的行為特徵,inte ce不能包含任何變數,介面是引用型別。舉個簡單的例子,乙個動物的介面,動物有吃的能力,有叫的能力,等等,這裡省略,假如動物就只有吃和叫的能力。pac...
Go方法和介面
go沒有類,不過可以通過為結構體型別定義方法。方法只是一類帶特殊的接收者引數的函式。import math type point struct 計算兩個點之間的距離 函式 func distance p,q point float64 方法 func p point distance q point...
Go語言基礎之介面
介面 inte ce 定義了乙個物件的行為規範,只定義規範不實現,由具體的物件來實現規範的細節。在go語言中介面 inte ce 是一種型別,一種抽象的型別。inte ce是一組method的集合,是duck type programming的一種體現。介面做的事情就像是定義乙個協議 規則 只要一台...