本文是李文周的部落格go語言學習之路的目錄提要版,方便複習檢視使用,原文參見文章連線:
介面(inte***ce)定義了乙個物件的行為規範,只定義規範不實現,由具體的物件來實現規範的細節。
在go語言中介面(inte***ce)是一種型別,一種抽象的型別。
inte***ce
是一組method
的集合,是duck-type programming
的一種體現。介面做的事情就像是定義乙個協議(規則),只要一台機器有洗衣服和甩乾的功能,我就稱它為洗衣機。不關心屬性(資料),只關心行為(方法)。
type 介面型別名 inte***ce
type writer inte***ce
乙個物件只要全部實現了介面中的方法,那麼就實現了這個介面。換句話說,介面就是乙個需要實現的方法列表。
// sayer 介面
type sayer inte***ce
// 定義dog和cat兩個結構體:
type dog struct
type cat struct
// dog實現了sayer介面
func
(d dog)
say(
)// cat實現了sayer介面
func
(c cat)
say(
)// 介面型別變數 實現介面的好處
func
main()
// 例項化乙個cat
b := dog
// 例項化乙個dog
x = a // 可以把cat例項直接賦值給x
x.say()
// 喵喵喵
x = b // 可以把dog例項直接賦值給x
x.say()
// 汪汪汪
}
當乙個方法需要指標接受者的時候,不能將值傳給它
當乙個方法需要值接受者的時候,可以將指標傳給它,會自動取值
type mover inte***ce
type dog struct
// 值接受者實現介面
func
(d dog)
move()
func
main()
// 旺財是dog型別
x = wangcai // x可以接收dog型別
var fugui =
&dog
// 富貴是*dog型別
x = fugui // x可以接收*dog型別
x.move()
}//指標接收者實現介面
func
(d *dog)
move()
func
main()
// 旺財是dog型別
x = wangcai // x不可以接收dog型別
var fugui =
&dog
// 富貴是*dog型別
x = fugui // x可以接收*dog型別
}
//1,乙個型別實現多個介面
// sayer 介面
type sayer inte***ce
// mover 介面
type mover inte***ce
// dog既可以實現sayer介面,也可以實現mover介面。
type dog struct
// 實現sayer介面
func
(d dog)
say(
)// 實現mover介面
func
(d dog)
move()
func
main()
x = a
y = a
x.say()
y.move()
}//2. 多個型別實現同一介面
go語言中不同的型別還可以實現同一介面 首先我們定義乙個mover介面,它要求必須由乙個move方法。
// mover 介面
type mover inte***ce
type dog struct
type car struct
// dog型別實現mover介面
func
(d dog)
move()
// car型別實現mover介面
func
(c car)
move()
func
main()
var b = car
x = a
x.move()
x = b
x.move()
}//3.並且乙個介面的方法,不一定需要由乙個型別完全實現,介面的方法可以通過在型別中嵌入其他型別或者結構體來實現。
// washingmachine 洗衣機
type washingmachine inte***ce
// 甩乾器
type dryer struct
// 實現washingmachine介面的dry()方法
func
(d dryer)
dry(
)// 海爾洗衣機
type haier struct
// 實現washingmachine介面的wash()方法
func
(h haier)
wash()
func
main()
// sayer 介面
type sayer inte***ce
// mover 介面
type mover inte***ce
// 介面巢狀
type animal inte***ce
// 巢狀得到的介面的使用與普通介面一樣,這裡我們讓cat實現animal介面:
type cat struct
func
(c cat)
say(
)func
(c cat)
move()
func
main()
x.move()
x.say()
}
空介面是指沒有定義任何方法的介面。因此任何型別都實現了空介面。
空介面型別的變數可以儲存任意型別的變數。
// 空介面定義
func
main()
s :=
"hello 沙河"
x = s
fmt.
printf
("type:%t value:%v\n"
, x, x)
i :=
100 x = i
fmt.
printf
("type:%t value:%v\n"
, x, x)
b :=
true
x = b
fmt.
printf
("type:%t value:%v\n"
, x, x)
}
// 空介面作為函式引數
func
show
(a inte***ce
)// 空介面作為map值
var studentinfo =
make
(map
[string
]inte***ce
) studentinfo[
"name"]=
"沙河娜扎"
studentinfo[
"age"]=
18 studentinfo[
"married"]=
false
fmt.
println
(studentinfo)
空介面可以儲存任意型別的值,那我們如何獲取其儲存的具體資料呢?
乙個介面的值(簡稱介面值)是由乙個具體型別
和具體型別的值
兩部分組成的。這兩部分分別稱為介面的動態型別
和動態值
。
var w io.writer
w = os.stdout
w =new
(bytes.buffer)
w =nil
判斷空介面中的值:
x.
(t)x:表示型別為inte***ce
的變數t:表示斷言x可能是的型別。
func
main()
x ="hello 沙河"
v, ok := x.
(string
)if ok
else
}func
justifytype
(x inte***ce
)}
因為空介面可以儲存任意型別值的特點,所以空介面在go語言中的使用十分廣泛。
關於介面需要注意的是,只有當有兩個或兩個以上的具體型別必須以相同的方式進行處理時才需要定義介面。不要為了介面而寫介面,那樣只會增加不必要的抽象,導致不必要的執行時損耗。
1 3Go語言環境
為了便於 學習與分享,建議各位大佬可以前往 github 免費註冊乙個賬戶,在此有很多優秀的go專案,可以較快的提高自己的開發能力。成功註冊github賬戶後,可以象下面這樣建立用於儲存 源 的資料夾 github賬戶名 macos或linux mkdir gopath src github.com...
13 go語言 開始專案實戰
1 爬蟲專案介紹 網路爬蟲分類 通用爬蟲,如baidu,google 聚焦爬蟲,從網際網路獲取結構化資料 go語言的爬蟲庫 框架 henrylee2cn pholcus gocrawl colly hu17889 go spider 將不使用現成的爬蟲庫 框架 使用elasticsearch作為資料...
搞定Go語言 第2天13 Go語言檔案操作
計算機中的檔案是儲存在外部介質 通常是磁碟 上的資料集合,檔案分為文字檔案和二進位制檔案。os.open 函式能夠開啟乙個檔案,返回乙個 file和乙個err。對得到的檔案例項呼叫close 方法能夠關閉檔案。package main import fmt os func main 關閉檔案 fil...