浅谈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 package中init方法的多处定义及运行顺序问题
May 06 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
深入理解go slice结构
Sep 15 Golang
Go 中的空白标识符下划线
Mar 25 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang 实现WebSockets
Apr 24 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 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中str_pad()函数用法分析
2017/03/28 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
javascript 面向对象编程基础:继承
2009/08/21 Javascript
比较搞笑的js陷阱题
2010/02/07 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
js实现滑动触屏事件监听的方法
2015/05/05 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
python获取当前计算机cpu数量的方法
2015/04/18 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
python 随机森林算法及其优化详解
2019/07/11 Python
Python配置文件处理的方法教程
2019/08/29 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
python+opencv实现车道线检测
2021/02/19 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
创意婚礼策划方案
2014/05/18 职场文书
中药学专业求职信
2014/05/31 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
vue elementUI批量上传文件
2022/04/26 Vue.js
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript