2 07 Go之介面和型別之間的轉換

2022-09-27 11:12:09 字數 2236 閱讀 8740

go語言中使用介面斷言(type assertions)將介面轉換成另外乙個介面,也可以將介面轉換為另外的型別。

格式:

i.(t)i表示乙個介面的型別和t表示乙個型別

斷言的基本格式:

t := i.(t)

/*i 代表介面變數,t 代表轉換的目標型別,t 代表轉換後的變數

*/

三種情況:

var w io.writer

w = 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 main

​import "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的一種體現。介面做的事情就像是定義乙個協議 規則 只要一台...