浅谈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 相关文章推荐
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
go设置多个GOPATH的方式
May 05 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
2014过年倒计时示例
2014/01/31 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
PDO::_construct讲解
2019/01/27 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
JavaScript日历实现代码
2010/09/12 Javascript
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
简述 Python 的类和对象
2020/08/21 Python
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
销售文员的岗位职责
2013/11/20 职场文书
经营目标管理责任书
2014/07/25 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
大学生村官入党自传
2015/06/26 职场文书
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis