浅谈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
基于Go Int转string几种方式性能测试
Apr 28 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
goland 设置project gopath的操作
May 06 Golang
解决golang 关于全局变量的坑
May 06 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
Go语言基础知识点介绍
Jul 04 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 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中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
php开启openssl的方法
2014/05/15 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
asp.net和php的区别点总结
2019/10/10 PHP
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
js实现时间日期校验
2020/05/26 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
Django模板Templates使用方法详解
2019/07/19 Python
什么是Python中的匿名函数
2020/06/02 Python
浅析Python面向对象编程
2020/07/10 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
回门宴新郎答谢词
2014/01/12 职场文书
圣诞节红领巾广播稿
2014/02/03 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
2014年德育工作总结
2014/11/20 职场文书
面试通知单大全
2015/04/20 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python
JS数组方法some、every和find的使用详情
2021/10/05 Javascript