浅谈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 比较浮点数的大小方式
May 02 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
goland 设置project gopath的操作
May 06 Golang
解决golang 关于全局变量的坑
May 06 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Golang 链表的学习和使用
Apr 19 Golang
Golang jwt身份认证
Apr 20 Golang
Golang入门之计时器
May 04 Golang
Go语言入门exec的基本使用
May 20 Golang
Go语言编译原理之变量捕获
Aug 05 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
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
jquery禁用右键示例
2014/04/28 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
Python中的Numpy入门教程
2014/04/26 Python
python使用marshal模块序列化实例
2014/09/25 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
C语言50道问题
2014/10/23 面试题
小学教师学期末自我评价
2013/09/25 职场文书
工艺员岗位职责
2014/02/11 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
开展警示教育活动总结
2015/05/09 职场文书
jQuery实现影院选座订座效果
2021/04/13 jQuery
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python