浅谈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语言中break label与goto label的区别
Apr 28 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
Golang中异常处理机制详解
Jun 08 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
Go 语言结构实例分析
Jul 04 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
Golang gRPC HTTP协议转换示例
Jun 16 Golang
在ubuntu下安装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
php SQL防注入代码集合
2008/04/25 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
js下用eval生成JSON对象
2010/09/17 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
vue内置指令详解
2018/04/03 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
pandas apply多线程实现代码
2020/08/17 Python
pandas 数据类型转换的实现
2020/12/29 Python
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
管理站站长岗位职责
2013/11/27 职场文书
给医务人员表扬信
2014/01/12 职场文书
高一政治教学反思
2014/01/28 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL