一篇文章帶你瞭解 Go 語言基礎之接口(下篇)
前言
Hey,大家好呀,我是碼農, 星期八,上次咱們說的接口呀,還是沒說完,還剩下了一些,一篇文章帶你瞭解 Go 語言基礎之接口(上篇),下面就來看看叭!!
空接口含義
本篇介紹的就是存儲類接口,存儲接是我的命名,其實人家就叫空接口。
空接口的作用就是可以存儲任何數據。
同理,空接口沒有定義任何方法,也就是說任何接口都實現了空接口,所以空接口才能存任意數據。
空接口
空接口示例代碼
package main
import "fmt"
func main() {
//變量直接賦值爲空接口
var x interface{}
x = 1
x = 1.1
x = "666"
x = [3]int{1, 2, 3} //數組
x = []int{6, 23} //切片
x = map[string]string{
"Name": "張三",
"Age": "666",
}
fmt.Println(x)
//map中value類型爲空接口
var y = map[string]interface{}{
"Name":"張三",
"Age":18,
}
fmt.Println(y)
}
執行結果
空接口確實是可以存儲任何數據的,並且是直接可以使用的。
空接口在函數中的應用
不知道你有沒有想過,如果函數的參數,也是一個空接口,那不是就可以隨便傳值了嗎?
我還用個毛靜態類型,以後都用空接口得了,嗯。。。這個按下不表,等會說。
函數參數爲空接口代碼
package main
import "fmt"
func say(x interface{}) {
fmt.Println(x)
}
func main() {
say(1)
say("666")
say([]int{5, 1, 3})
}
確實是如上述所說,函數參數爲空接口類類型,的確可以傳任何數據。
但是僅限打印時可以隨便打印。
假設我想讓傳入的值+1
。
func say(x interface{}) {
fmt.Println(x)
fmt.Println(x+1)
}
報錯信息
所以說,空接口並不是萬能的。
類型斷言
上述函數雖然可以接收任意類型。
但是我有個需求。
如果傳入的是 int 類型,參數 + 100。
如果傳入的是字符串類型,參數 +"666"。
如果傳入的是其他類型,返回不存在。
這該怎麼辦呢?這就要用到斷言這個功能。
斷言語法
空接口.(類型)
示例代碼
func say(x interface{}) {
value, ok := x.(int)
if ok {
//如果是ok表示斷言成功,是int類型
fmt.Println(value + 100)
}
value2, ok := x.(string)
if ok {
//斷言成功表示是字符串
fmt.Println(value2 + "666")
}
}
如果說有很多類型,斷言起來比較麻煩,這時候用switch
比較好。
func say(x interface{}) {
switch value := x.(type) {
case int:
fmt.Println(value + 10)
case string:
fmt.Println(value + "666")
default:
fmt.Println("啥都不是")
}
}
//case可以繼續寫,可以寫很多很多
執行結果
總結
到此爲止,Go 語言的接口是全部都講完了。
接口主要分爲行爲接口和存儲接口。
-
行爲接口主要用在面向對象這個方向, 規定父類必須有哪些動作。
-
空接口時爲了方便存值, 可以存儲任意類型。
如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。
加油!!!我是碼農星期八,如果覺得還不錯,記得動手點贊一下哈。感謝你的觀看。
Go 語言進階學習 該公衆號專注於分享 Go 語言相關的技術文章、工具資源、學習視頻、學習資料、送書活動等,您的關注是我們的奮鬥源動力~~~ 關注我們,您收穫的不只是知識,還有經驗與人脈!
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/LZUyEIadB9TmAFwkPA-f9Q