浅谈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中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang json数组拼接的实例
Apr 28 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
golang goroutine顺序输出方式
Apr 29 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 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中PDO的事务处理分析
2016/04/07 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
Python中优化NumPy包使用性能的教程
2015/04/23 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
python requests.post带head和body的实例
2019/01/02 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
python中xlutils库用法浅析
2020/12/29 Python
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
应届毕业生求职信范文
2013/12/18 职场文书
2014年药品销售工作总结
2014/12/16 职场文书
高考1977观后感
2015/06/04 职场文书
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL