浅谈Golang 嵌套 interface 的赋值问题


Posted in Golang onApril 29, 2021

大家还是直接看代码吧~

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 相关文章推荐
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
golang中的空slice案例
Apr 27 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
Go使用协程交替打印字符
Apr 29 Golang
golang 实现时间戳和时间的转化
May 07 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Go 语言结构实例分析
Jul 04 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 #Golang
Golang 空map和未初始化map的注意事项说明
彻底理解golang中什么是nil
基于Go Int转string几种方式性能测试
Apr 28 #Golang
Go语言中break label与goto label的区别
golang 如何用反射reflect操作结构体
Apr 28 #Golang
golang 生成对应的数据表struct定义操作
Apr 28 #Golang
You might like
下载文件的点击数回填
2006/10/09 PHP
php中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
实用函数5
2007/11/08 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
一些常用的JS功能函数代码
2009/06/23 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
python实现字符串加密成纯数字
2019/03/19 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
2020/05/24 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
技校毕业生自荐信范文
2014/03/07 职场文书
社保转移委托书范本
2014/10/08 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
放假通知格式
2015/04/14 职场文书
如何用python插入独创性声明
2021/03/31 Python
pytorch 使用半精度模型部署的操作
2021/05/24 Python