浅谈Golang 嵌套 interface 的赋值问题

 更新时间:2021年04月29日 10:21:33   作者:潘广宇 Leo  
这篇文章主要介绍了浅谈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,但是反过来就不成立

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

相关文章

  • Golang使用Channel组建高并发HTTP服务器

    Golang使用Channel组建高并发HTTP服务器

    Golang 作为一门高效的语言,在网络编程方面表现也非常出色,这篇文章主要介绍了如何使用 Golang 和 Channel 组建高并发 HTTP 服务器,感兴趣的可以了解一下
    2023-06-06
  • Go语言使用sqlx操作数据库的示例详解

    Go语言使用sqlx操作数据库的示例详解

    sqlx 是 Go 语言中一个流行的第三方包,它提供了对 Go 标准库 database/sql 的扩展,本文重点讲解 sqlx 在 database/sql 基础上扩展的功能,希望对大家有所帮助
    2023-06-06
  • CGO编程基础快速入门

    CGO编程基础快速入门

    这篇文章主要为大家介绍了CGO编程基础快速入门示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go调度器学习之协作与抢占详解

    Go调度器学习之协作与抢占详解

    如果某个G执行时间过长,其他的G如何才能被正常调度,这就引出了接下来的话题:协作与抢占。本文将通过一些示例为大家详细讲讲调度器中协作与抢占的相关知识,需要的可以参考一下
    2023-04-04
  • 一篇文章学会GO语言中的变量

    一篇文章学会GO语言中的变量

    Go语言是静态类型语言,因此变量有明确类型的,编译器也会检查变量类型的正确性,下面这篇文章主要给大家介绍了关于GO语言中变量的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • gORM操作MySQL的实现

    gORM操作MySQL的实现

    本文主要介绍了gORM操作MySQL的实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • golang time包下定时器的实现方法

    golang time包下定时器的实现方法

    定时器的实现大家应该都遇到过,最近在学习golang,所以下面这篇文章主要给大家介绍了关于golang time包下定时器的实现方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • go语言定时器Timer及Ticker的功能使用示例详解

    go语言定时器Timer及Ticker的功能使用示例详解

    这篇文章主要为大家介绍了go语言定时器的功能使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 一文教你如何用好GO语言变长参数

    一文教你如何用好GO语言变长参数

    对于函数重载相信编码过的 xdm 肯定不会陌生,那么我们一起分别来看看 C 语言,C++ 语言,GO 语言 如何去模拟和使用重载,感兴趣的可以学习一下
    2023-09-09
  • GO如何模拟流操作实现示例探究

    GO如何模拟流操作实现示例探究

    这篇文章主要为大家介绍了GO如何模拟流操作实现示例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论