浅谈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{}转为数组的操作
Apr 30 Golang
golang日志包logger的用法详解
May 05 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
深入理解go slice结构
Sep 15 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Go语言入门exec的基本使用
May 20 Golang
Golang实现可重入锁的示例代码
May 25 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
Go语言编译原理之变量捕获
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
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
理解javascript中try...catch...finally
2015/12/25 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
微信小程序实现tab和swiper切换结合效果
2020/07/17 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
推荐几个不错的console调试技巧实现
2019/12/20 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
ES6学习教程之Promise用法详解
2020/11/22 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
一句话工作感言
2014/03/01 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
商场周年庆活动方案
2014/08/19 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
大学生求职自荐信
2015/03/24 职场文书
晚会开幕词范文
2016/03/04 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技
Python中npy和mat文件的保存与读取
2022/04/24 Python