浅谈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 interface判断为空nil的实现代码
Apr 24 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
goland设置颜色和字体的操作
May 05 Golang
golang elasticsearch Client的使用详解
May 05 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Golang入门之计时器
May 04 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写的serv-u的web申请账号的程序
2006/10/09 PHP
利用PHP制作简单的内容采集器的原理分析
2008/10/01 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
Safari5中alert的无限循环BUG
2011/04/07 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
Vue.use源码分析
2017/04/22 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
24式加速你的Python(小结)
2019/06/13 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
中国电视购物:快乐购
2017/02/04 全球购物
《草原》教学反思
2014/02/15 职场文书
答谢词范文
2015/01/05 职场文书
护士节慰问信
2015/02/15 职场文书
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫