当前位置 博文首页 > 浅谈Golang 嵌套 interface 的赋值问题

    浅谈Golang 嵌套 interface 的赋值问题

    作者:潘广宇 Leo 时间:2021-05-31 17:58

    大家还是直接看代码吧~

    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,但是反过来就不成立

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持站长博客。如有错误或未考虑完全的地方,望不吝赐教。

    js