浅谈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 26 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Go 中的空白标识符下划线
Mar 25 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
golang的文件创建及读写操作
Apr 14 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang bufio详细讲解
Apr 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
PHP新手上路(七)
2006/10/09 PHP
php遍历数组的方法分享
2012/03/22 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
BootStrap导航栏问题记录
2017/07/31 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
spyder常用快捷键(分享)
2017/07/19 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
python 导入数据及作图的实现
2019/12/03 Python
Python属性和内建属性实例解析
2020/01/14 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
年级组长自我鉴定
2014/02/22 职场文书
老师的检讨书
2014/02/23 职场文书
联谊会主持词
2014/03/26 职场文书
《故乡》教学反思
2014/04/10 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers