浅谈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如何去除多余空白字符(含制表符)
Apr 25 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
golang 实现Location跳转方式
May 02 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang map映射的用法
Apr 22 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
Go结合Gin导出Mysql数据到Excel表格
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
php 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
php中的依赖注入实例详解
2019/08/14 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
原生js实现图片轮播特效
2015/12/18 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
eslint+prettier统一代码风格的实现方法
2020/07/22 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
解决python升级引起的pip执行错误的问题
2018/06/12 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
Python中调用其他程序的方式详解
2019/08/06 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
介绍一下Java中的static关键字
2012/05/12 面试题
工业自动化毕业生自荐信范文
2014/01/04 职场文书
《石榴》教学反思
2014/03/02 职场文书
金融管理毕业生求职信
2014/03/03 职场文书
运动会口号8字
2014/06/07 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
挂靠协议书
2015/01/27 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
关于分班的感言
2015/08/04 职场文书