淺談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" // 修改一個(gè)屬性,類型轉(zhuǎn)換為map[string]interface{}
s["data"].(map[string]interface{})["new"] = "bbb" // 新增一個(gè)屬性
fmt.Println(s)
}
補(bǔ)充:Golang interface賦值與取值的實(shí)例
大家還是直接看代碼吧~
bs := make(map[string]string)
bs["name"] = "張三"
bs["age"] = "12"
var student interface{}
student = bs
a := student.(map[string]string) //將interface轉(zhuǎn)換為map類型,如果不確定數(shù)據(jù)類型的時(shí)候可以使用類型斷言,確定其類型之后再轉(zhuǎn)換為相對應(yīng)的類型,然后取值
fmt.Printf("學(xué)生的姓名是: \n %v", a["name"]) //結(jié)果: 張三
fmt.Printf("學(xué)生的數(shù)據(jù)是: \n %v", student)
補(bǔ)充:go語言學(xué)習(xí)-接口賦值的兩種類型
接口賦值在go語言中分為下面兩種情況:
1、將對象實(shí)例賦值給接口
在我看來go語言的接口就是c++中虛函數(shù)的聲明,使用者可以根據(jù)自身使用的需要聲明一個(gè)函數(shù)的集合,將需要的方法都在接口中聲明,有點(diǎn)像c++中,子類繼承父類之后,通過子類對象給父類賦值,因?yàn)楦割愑械姆椒ǎǔ接蟹椒?子類肯定都有,尤其是虛函數(shù),這樣比C++好的地方是go語言中不需要通過繼承的方式來實(shí)現(xiàn)多態(tài),不同的對象只需要將接口中的所有方法都實(shí)現(xiàn)即可,本質(zhì)上和c++一樣,實(shí)現(xiàn)這些接口的對象相當(dāng)于子類,這個(gè)接口相當(dāng)于父類,不同的地方go語言中少了繼承的過程,耦合度更低。
將一個(gè)接口賦值給另一個(gè)接口(同理)
2、將對象實(shí)例賦值給接口
這要求該對象實(shí)例實(shí)現(xiàn)了所有該接口提供的方法,下面是代碼實(shí)例:
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) //該條語句不能通過編譯
}
第二種方法通過一個(gè)接口給另一個(gè)接口賦值,在go語言中只要兩個(gè)接口擁有同樣的方法列表(次序不同不要緊),那么他們就是等同的,可以相互賦值
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語言中,這兩個(gè)接口是等價(jià)的,因?yàn)椋?/h2>
1、任何實(shí)現(xiàn)了one.ReadWriter接口的類,均實(shí)現(xiàn)了two.ReadWriter
2、任何one.ReadWriter的接口可以賦值給two.ReadWriter,反之亦然
3、在任何地方使用two.ReadWriter的接口和使用one.ReadWriter的接口沒有差別
接口賦值并不是要求兩個(gè)接口是等價(jià)的,如果A的方法列表是接口B的方法列表的子集,那么接口B可以賦值給接口A,但是反過來就不成立
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
golang簡易實(shí)現(xiàn)?k8s?的yaml上傳并應(yīng)用示例方案
這篇文章主要為大家介紹了golang簡易實(shí)現(xiàn)?k8s?的yaml上傳并應(yīng)用示例方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解
這篇文章主要介紹了golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
go編程中g(shù)o-sql-driver的離奇bug解決記錄分析
這篇文章主要為大家介紹了go編程中g(shù)o-sql-driver的離奇bug解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Go語言使用templ實(shí)現(xiàn)編寫HTML用戶界面
templ是一個(gè)在 Go 中編寫 HTML 用戶界面的語言,使用 templ,我們可以創(chuàng)建可呈現(xiàn) HTML 片段的組件,下面就跟隨小編一起了解一下具體的實(shí)現(xiàn)方法吧2023-12-12

