淺談Golang 嵌套 interface 的賦值問題
大傢還是直接看代碼吧~
package main import ( "fmt" ) func main() { s := map[string]interface{}{ "code":0, "msg":"", "data":map[string]interface{}{ "src":"", }, } s["data"].(map[string]interface{})["src"] = "abc" // 修改一個屬性,類型轉換為map[string]interface{} s["data"].(map[string]interface{})["new"] = "bbb" // 新增一個屬性 fmt.Println(s) }
補充:Golang interface賦值與取值的實例
大傢還是直接看代碼吧~
bs := make(map[string]string) bs["name"] = "張三" bs["age"] = "12" var student interface{} student = bs a := student.(map[string]string) //將interface轉換為map類型,如果不確定數據類型的時候可以使用類型斷言,確定其類型之後再轉換為相對應的類型,然後取值 fmt.Printf("學生的姓名是: \n %v", a["name"]) //結果: 張三 fmt.Printf("學生的數據是: \n %v", student)
補充:go語言學習-接口賦值的兩種類型
接口賦值在go語言中分為下面兩種情況:
1、將對象實例賦值給接口
在我看來go語言的接口就是c++中虛函數的聲明,使用者可以根據自身使用的需要聲明一個函數的集合,將需要的方法都在接口中聲明,有點像c++中,子類繼承父類之後,通過子類對象給父類賦值,因為父類有的方法(除私有方法)子類肯定都有,尤其是虛函數,這樣比C++好的地方是go語言中不需要通過繼承的方式來實現多態,不同的對象隻需要將接口中的所有方法都實現即可,本質上和c++一樣,實現這些接口的對象相當於子類,這個接口相當於父類,不同的地方go語言中少瞭繼承的過程,耦合度更低。
將一個接口賦值給另一個接口(同理)
2、將對象實例賦值給接口
這要求該對象實例實現瞭所有該接口提供的方法,下面是代碼實例:
package main import ( "fmt" ) type Integer int func (a Integer)Less(b Integer) bool{ return a<b } func (a *Integer)Add(b Integer) { *a += b } type Lesser interface { Less(b Integer) bool } type LessAdder interface { Less(b Integer) bool Add(b Integer) } func main(){ fmt.Println("start ...") var inter Integer = 1 var lesser Lesser = inter isLess := lesser.Less(3) fmt.Println(lesser,"less 3 is ",isLess) var lessAdder LessAdder = &inter lessAdder.Add(3) fmt.Println("lessAdder add 3 is ",inter) //fmt.Println("lessAdder is ",*lessAdder) //該條語句不能通過編譯 }
第二種方法通過一個接口給另一個接口賦值,在go語言中隻要兩個接口擁有同樣的方法列表(次序不同不要緊),那麼他們就是等同的,可以相互賦值
package one type ReadWriter interface{ Read(buf []byte)(n int,err error) Write(buf []byte)(n int,err error) } package two type Istream interface{ Read(buf []byte)(n int,err error) Write(buf []byte)(n int,err error) } var file1 one.ReadWriter = new(file) var file2 two.Istream = file1 var file3 one.ReadWriter = file2
在go語言中,這兩個接口是等價的,因為:
1、任何實現瞭one.ReadWriter接口的類,均實現瞭two.ReadWriter
2、任何one.ReadWriter的接口可以賦值給two.ReadWriter,反之亦然
3、在任何地方使用two.ReadWriter的接口和使用one.ReadWriter的接口沒有差別
接口賦值並不是要求兩個接口是等價的,如果A的方法列表是接口B的方法列表的子集,那麼接口B可以賦值給接口A,但是反過來就不成立
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Go語言中interface語法與使用詳解
- Go語言接口的用法詳解
- Go 語言選擇器實例教程
- 基於go interface{}==nil 的幾種坑及原理分析
- golang中按照結構體的某個字段排序實例代碼