Go語言學習筆記 介面

2021-10-05 01:55:59 字數 4056 閱讀 1407

go語言中使用組合實現物件特性的描述

對外通過介面暴露能使用的特性

go語言的介面設計是非侵入式的,介面編寫者無需知道介面被哪些型別實現。而介面實現者只需要知道實現的是什麼樣子的介面。

介面實現者不需要關係介面被怎樣使用,呼叫者無需關心介面的實現細節。

概念:介面是一種型別,也是一種抽象結構,不會暴露所含資料的格式、型別和結構。

每個介面型別由數個方法組成,格式如下:

type 介面型別名 inte***ce

開發中常見介面及寫法:

type writer inte***ce

type stringer inte***ce

1.介面的方法與實現介面的型別方法格式一致2.介面中所有的方法均被實現。

package main

import

("fmt"

)//定義乙個資料寫入器

type datawriter inte***ce

)error

}//定義檔案結構,用於實現datawriter

type file struct

//實現datawriter介面的writedata()方法

func

(d *file)

writerdata

(data inte***ce

)error

func

main()

如果函式名不一樣會報錯嗎?

type datawriter inte***ce

)error

}//定義檔案結構,用於實現datawriter

type file struct

//實現datawriter介面的writedata()方法

func

(d *file)

writedata

(data inte***ce

)error

編譯器會輸出:

如果方法簽名不一樣呢?答案是也會報錯

1.乙個型別可以實現多個介面

看乙個例子:

package main

import

("io"

)//介面

type writer inte***ce

type closer inte***ce

type socket struct

//實現介面

func

(s *socket)

writer

(p [

]byte

)(n int

, err error

)func

(s *socket)

close()

error

//使用介面

func

usingwriter

(writer io.writer)

func

usingcloser

(closer io.closer)

func

main()

圖示:

2.多個型別可以實現相同的介面

也就是說乙個介面中的方法可以由多個不同型別實現。

介面和介面之間也可以巢狀組合成新的介面,只要介面的所有方法被實現,則這個介面的所有巢狀介面的方法均可以被呼叫。

介面巢狀組合示例:

go語言的io包中定義了寫入器(writer)、關閉器(closer)、和寫入關閉器(writeclose)3個介面。

實現:

package main

import

("io"

)type writer inte***ce

type closer inte***ce

type writecloser inte***ce

//宣告乙個裝置結構

type device struct

//實現io.writer的write()方法

func

(d *device)

write

(p [

]byte

)(n int

, err error

)//實現io.closer的close方法

func

(d *device)

close()

error

func

main()

go語言中使用介面斷言將介面轉換成另外乙個介面,也可以將介面轉換成為另外的型別。介面的轉換在開發中非常常見,使用也非常的頻繁。

型別斷言的基本格式:

t :=i.

(t)//t表示轉換後的變數

//t代表轉換的目標型別

//i代表介面變數

//另一種寫法。

t ,ok :=i.

(t)//這種寫法,如果發生介面未實現時,將會把ok置為false,t置為t型別的0值。

介面可以轉換為其他介面。介面也可以轉換為其他型別。

介面在轉換為其他型別時,介面內儲存的例項對應的指標,而且是要轉換的對應的型別指標。

將值儲存到空介面

package main

import

("fmt"

)//空介面

var any inte***ce

func

main()

輸出:

1hello

false

從空介面獲取值

var b bool

= any.

(bool

) fmt.

println

(b)

輸出:false

注意:多個不同型別的值連續賦給空介面,空介面會儲存值。但是空介面的型別會進行覆蓋,取值的話只能取最後放入的那個型別的值。

比如:如果上述例子中取int型的話就會宕機:

var b int

= any.

(int

) fmt.

println

(b)

會出現這樣的宕機內容:

panic: inte***ce conversion: inte***ce {} is bool, not int

空介面的值比較:用空介面儲存值可以進行比較,如果兩個不相等,返回false.

型別分支斷言的基本格式:

switch 介面變數.

(type

)

示例:使用型別分支判斷基本型別

package main

import

("fmt"

)func

printtype

(v inte***ce)}

func

main()

輸出:

1024 is int

pig is string

true is bool

go語言學習筆記

type info struct func main fmt.println info1 data,json.marshal info1 fmt.println string data 輸出 這裡要特別注意的是 json 冒號後面和雙引號之間千萬不要有空格!被坑慘了 go語言 import的包的前面...

Go語言 學習筆記

import 下劃線 如 import hello imp 的作用 當匯入乙個包時,該包下的檔案裡所有init 函式都會被執行,然而,有些時候我們並不需要把整個包都匯入進來,僅僅是是希望它執行init 函式而已。這個時候就可以使用 import 引用該包。即使用 import 包路徑 只是引用該包,...

Go語言學習筆記

一.go程式開發注意事項 go原始檔以 go 為副檔名。go應用程式的執行入口是main 函式。go語言干戈區分大小寫。go方法由一條條語句構成,每個語句後不需要分號 go語言會在每行後自動加分號 這也體現出golang的簡潔性。go編譯器是一行行進行編譯的,因此我們一行就寫一條語句,不能把多條語句...