通过一个题目三种变式讲清楚go接口类型断言
【第一种】一种类型实现多个接口,各个接口变量调用各自的方法
type Work struct {
    i int
}
func (w Work) ShowA() int {
    return w.i + 10
}
func (w Work) ShowB() int {
    return w.i + 20
}
func main() {
    c := Work{3}
    var a A = c
    var b B = c
    fmt.Println(a.ShowA())
    fmt.Println(b.ShowB())
}
输出:13 23。
一种类型实现多个接口,结构体 Work 分别实现了接口 A、B,所以接口变量 a、b 调用各自的方法 ShowA() 和 ShowB(),输出 13、23。
【第二种】一种类型实现多个接口,各个接口变量调用不是自己的方法
type Work struct {
    i int
}
func (w Work) ShowA() int {
    return w.i + 10
}
func (w Work) ShowB() int {
    return w.i + 20
}
func main() {
    c := Work{3}
    var a A = c
    var b B = c
    fmt.Println(a.ShowB())
    fmt.Println(b.ShowA())
}
a、b 具有相同的动态类型和动态值,分别是结构体 work 和 {3};a 的静态类型是 A,b 的静态类型是 B,接口 A 不包括方法 ShowB(),接口 B 也不包括方法 ShowA(),编译报错。
【第三种】一种类型实现多个接口,各个接口变量进行类型转换后,调用不是自己的方法
type A interface {
    ShowA() int
}
type B interface {
    ShowB() int
}
type Work struct {
    i int
}
func (w Work) ShowA() int {
    return w.i + 10
}
func (w Work) ShowB() int {
    return w.i + 20
}
func main() {
    var a A = Work{3}
    s := a.(Work)
    fmt.Println(s.ShowA())
    fmt.Println(s.ShowB())
}
输出:13 23。
通过类型断言将接口变量 a 转换为具体类型 Work。
调用 Work 类型的方法 ShowA 和 ShowB,并根据 w.i 的值计算结果。
底层原理
这涉及到了 Go 语言中的接口和类型断言的底层原理。
- 接口的内部表示: - 在 Go 中,接口的内部表示包括两部分:值和类型指针。
- 当一个类型被赋值给一个接口变量时,会将这个值的副本存储在接口的值部分,同时将指向类型信息的指针存储在接口的类型部分。
 
- 类型断言: - 类型断言允许我们从接口中检索其动态类型的值。
- 当我们使用类型断言将接口值转换为具体类型时,Go 会检查接口的动态类型和我们所期望的类型是否匹配。
- 如果匹配,类型断言会返回具体类型的值;如果不匹配,则会导致运行时恐慌。
 
在这个例子中,虽然变量 a 是一个 A 类型的接口变量,但它包含的是一个 Work 类型的值,所以它实际上拥有 Work 类型的方法集。因此,当我们将 a 进行类型断言,转换为 Work 类型的值 s 时,s 实际上是一个 Work 类型的变量,它可以调用 Work 类型的所有方法,包括 ShowB()。
这就是为什么在这个例子中,尽管 a 是一个 A 类型的接口变量,但我们仍然可以调用 s.ShowB() 而不会报错。因为在运行时,s 是一个 Work 类型的变量,而 Work 类型有 ShowB() 方法。
通过一个题目三种变式讲清楚go接口类型断言的更多相关文章
- String  js删除字符串的最后一个字符三种方法
		字符串 var basic = "abc,def,ghi,"; 第一种 basic = basic.substr(0, basic.length - 1); 第二种 basic = ... 
- js删除字符串的最后一个字符三种方法
		字符串 var basic = "abc,def,ghi,"; 第一种 basic = basic.substr(0, basic.length - 1); 第二种 basic = ... 
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
		1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ... 
- Spring IOC 三种注入方式(构造器,setter,接口)
		Spring的依赖注入有三种方式: 1,构造器注入 2,setter注入 3,接口注入 下面我给大家介绍一下这三种注入 1.构造器注入 构造器注入主要是依赖于构造方法去实现,构造方法可以是有参也可以是 ... 
- 三种方法实现调用Restful接口
		1.基本介绍 Restful接口的调用,前端一般使用ajax调用,后端可以使用的方法比较多, 本次介绍三种: 1.HttpURLConnection实现 2.HttpClient实现 3.Spring ... 
- Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期
		servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ... 
- 51、多线程创建的三种方式之实现Callable接口
		实现Callable接口创建线程 Callable接口是在jdk5版本中加入的,这个接口在java.util.concurrent包下面,与其他两种方式不同的地方在于使用Callable接口创建的线程 ... 
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
		在研究OpenJDK源码过程中,我发现常用的设计方法就是2种:接口,接口-抽象类-具体实现类 . 在一些其它开源框架和业务开发中,经常存在着第3种设计,接口-具体实现类. 1.只有接口,没有实现类. ... 
- 50、多线程创建的三种方式之实现Runnable接口
		实现Runnable接口创建线程 使用Runnable创建线程步骤: package com.sutaoyu.Thread; //1.自定义一个类实现java.lang包下的Runnable接口 cl ... 
- SQL Server三种表连接原理
		在SQL Server数据库中,查询优化器在处理表连接时,通常会使用一下三种连接方式: 嵌套循环连接(Nested Loop Join) 合并连接 (Merge Join) Hash连接 (Hash ... 
随机推荐
- [春秋云镜] Initial
			[春秋云镜] Initial **整套网络环境拓扑:**  一.打进内网 开局一个ip:39.101.184.25,fscan扫一下  存在thinkphp5.0.23的漏洞,可以rce,我们 ... 
- 通过程序名称kill掉所有的进程
			通过程序名称kill掉所有的进程 今天差点把服务器搞崩了. 脚本的循环条件有问题,结果起了无数的nslookup,用pkill杀不掉,只能用kill一个个解决,服务器还被搞得慢得要命. 还好又黄队长, ... 
- ubuntu 18.04系统下CPU实时频率查看工具   cpupower
			1. cpupower 安装 sudo apt install linux-tools-common 2. CPU实时频率查看 watch -n 1 sudo cpupower monitor ... 
- 亲测可用的  Linux(Ubuntu18.04下)可运行的俄罗斯方块游戏的仿真环境—————————可用于强化学习算法的游戏模拟器环境
			俄罗斯方块模拟器(tetris 游戏),Python库地址: https://gitee.com/devilmaycry812839668/gym-tetris 在Python3.7环境下亲测可用: ... 
- 【转载】   Nature再发DeepMind研究:AI复现大脑网格细胞模拟导航!
			原文地址: https://news.eeany.cn/news/416675-19.html ==================================================== ... 
- JavaFx加载本地工程图片报错
			原因有两点: 1.png或者其他格式的图片文件没有放在src的直接目录下 2.路径填错,多了个符号等 正确姿势应该是 package com.fubao.tools.fx.Stage; import ... 
- Quartz.NET 的使用
			先貼使用代碼: 1 using Quartz; 2 using Quartz.Impl; 3 using Quartz.Logging; 4 using System; 5 using System. ... 
- 使用jquery的tmpl构建复杂表格
			Tmpl提供了几种tag:${}:等同于{{=}},是输出变量,通过了html编码的.{{html}}:输出变量html,但是没有html编码,适合输出html代码.{{if }} {{else}}: ... 
- [天线原理及设计>基本原理] 1. 辐射机制
			1. 辐射机制 1.1. Single Wire 单线 如果电荷不移动,则不会产生电流,也不会产生辐射. 如果电荷以匀速移动: a. 如果电线是直的,并且范围是无限的,则没有辐射. b. 如果电线弯曲 ... 
- C#读写图片文件到Access数据库中
			今天学习了把图片文件读写到数据库中,我是用的Access数据库,SQL还没去测试,不过都差不多 数据库表的样式 练习嘛就随便弄了下,说明下图片转成的字符串要用备注类型才可以哦 如果用的Sql数据库的话 ... 
