浅谈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判断key是否在map中的代码
Apr 24 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
Go标准容器之Ring的使用说明
May 05 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
golang定时器
Apr 14 Golang
Go语言测试库testify使用学习
Jul 23 Golang
基于Python实现西西成语接龙小助手
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开发过程中常用函数收藏
2009/12/14 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
PHP下对字符串的递增运算代码
2010/08/21 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
phpize的深入理解
2013/06/03 PHP
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
javascript连续赋值问题
2015/07/08 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
深入浅析同源策略和跨域访问
2015/11/26 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
JavaScript中动态向表格添加数据
2017/01/24 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
python实现堆和索引堆的代码示例
2018/03/19 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
python中下标和切片的使用方法解析
2019/08/27 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
Keras实现DenseNet结构操作
2020/07/06 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
小班开学寄语
2014/04/04 职场文书
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL