濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > 淺談Golang 嵌套 interface 的賦值問題

淺談Golang 嵌套 interface 的賦值問題

熱門標(biāo)簽:壽光微信地圖標(biāo)注 百度地圖標(biāo)注后傳給手機(jī) 阿克蘇地圖標(biāo)注 外呼系統(tǒng)用什么卡 外呼系統(tǒng)顯本地手機(jī)號(hào) 評(píng)價(jià)高的400電話辦理 電話機(jī)器人軟件免費(fèi) excel地圖標(biāo)注分布數(shù)據(jù) 涿州代理外呼系統(tǒng)

大家還是直接看代碼吧~

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)換為相對(duì)應(yīng)的類型,然后取值
fmt.Printf("學(xué)生的姓名是: \n %v", a["name"])   //結(jié)果: 張三
fmt.Printf("學(xué)生的數(shù)據(jù)是: \n %v", student)

補(bǔ)充:go語言學(xué)習(xí)-接口賦值的兩種類型

接口賦值在go語言中分為下面兩種情況:

1、將對(duì)象實(shí)例賦值給接口

在我看來go語言的接口就是c++中虛函數(shù)的聲明,使用者可以根據(jù)自身使用的需要聲明一個(gè)函數(shù)的集合,將需要的方法都在接口中聲明,有點(diǎn)像c++中,子類繼承父類之后,通過子類對(duì)象給父類賦值,因?yàn)楦割愑械姆椒ǎǔ接蟹椒?子類肯定都有,尤其是虛函數(shù),這樣比C++好的地方是go語言中不需要通過繼承的方式來實(shí)現(xiàn)多態(tài),不同的對(duì)象只需要將接口中的所有方法都實(shí)現(xiàn)即可,本質(zhì)上和c++一樣,實(shí)現(xiàn)這些接口的對(duì)象相當(dāng)于子類,這個(gè)接口相當(dāng)于父類,不同的地方go語言中少了繼承的過程,耦合度更低。

將一個(gè)接口賦值給另一個(gè)接口(同理)

2、將對(duì)象實(shí)例賦值給接口

這要求該對(duì)象實(shí)例實(shí)現(xiàn)了所有該接口提供的方法,下面是代碼實(shí)例:

package main
import (
 "fmt"
)
type Integer int
func (a Integer)Less(b Integer) bool{
 return ab
}
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ò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Golang中interface{}轉(zhuǎn)為數(shù)組的操作
  • Golang 實(shí)現(xiàn)interface類型轉(zhuǎn)string類型
  • 解決golang 反射interface{}做零值判斷的一個(gè)重大坑
  • 基于go interface{}==nil 的幾種坑及原理分析
  • golang interface判斷為空nil的實(shí)現(xiàn)代碼
  • 詳解Golang語言中的interface
  • 使用go的interface案例實(shí)現(xiàn)多態(tài)范式操作
  • go 類型轉(zhuǎn)換方式(interface 類型的轉(zhuǎn)換)

標(biāo)簽:梅河口 汕頭 欽州 蘭州 雞西 銅川 重慶 吐魯番

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Golang 嵌套 interface 的賦值問題》,本文關(guān)鍵詞  淺談,Golang,嵌套,interface,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談Golang 嵌套 interface 的賦值問題》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺談Golang 嵌套 interface 的賦值問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    公主岭市| 读书| 平安县| 太湖县| 丹阳市| 南宁市| 湖州市| 福安市| 象山县| 临潭县| 大余县| 吴旗县| 宁津县| 伊宁县| 翁牛特旗| 万山特区| 麻江县| 威宁| 探索| 盖州市| 泰兴市| 保德县| 萍乡市| 桐柏县| 江北区| 赤壁市| 凤台县| 嘉祥县| 盘锦市| 德令哈市| 从江县| 许昌市| 汉阴县| 永德县| 怀远县| 定兴县| 开化县| 龙胜| 襄垣县| 玉门市| 镇沅|