浅谈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语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
Go使用协程交替打印字符
Apr 29 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
golang内置函数len的小技巧
Jul 25 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
golang为什么要统一错误处理
Apr 03 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
深入理解 Golang 的字符串
May 04 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 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
咖啡常见的种类
2021/03/03 新手入门
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
Mac 安装 nodejs方法(图文详细步骤)
2017/10/30 NodeJs
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
Python字符串中查找子串小技巧
2015/04/10 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
大专自我鉴定范文
2013/10/23 职场文书
2014年自我评价
2014/01/04 职场文书
教师学习培训邀请函
2014/02/04 职场文书
公司领导班子对照材料
2014/08/18 职场文书
教师考核鉴定意见
2015/06/05 职场文书
证婚人致辞精选
2015/07/28 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
导游词幽默开场白
2019/06/26 职场文书
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js
vue实现在data里引入相对路径
2022/06/05 Vue.js