Go 语言从入门到实战
蔡超
Mobvista 技术副总裁兼首席架构师,前亚马逊(中国)首席软件架构师
48919 人已学习
新⼈⾸单¥59
课程目录
已完结/共 55 讲
第一章:Go语言简介 (4讲)
第二章:基本程序结构 (4讲)
第三章:常用集合 (3讲)
第四章:字符串 (1讲)
时长 16:47
第五章:函数 (2讲)
第六章:面向对象编程 (4讲)
第七章:编写好的错误处理 (2讲)
第八章:包和依赖管理 (2讲)
第九章:并发编程 (7讲)
第十章:典型并发任务 (5讲)
第十一章:测试 (3讲)
时长 11:48
时长 07:12
时长 06:15
第十二章:反射和Unsafe (3讲)
时长 08:18
时长 08:03
第十三章:常见架构模式的实现 (2讲)
第十四章:常见任务 (4讲)
时长 04:27
时长 05:14
第十五章:性能调优 (4讲)
第十六章:高可用性服务设计 (5讲)
Go 语言从入门到实战
登录|注册
留言
21
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 18 | 不一样的接口类型,一样的多态
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | Go语言课程介绍
02 | 内容综述
03 | Go语言简介:历史背景、发展现状及语言特性
04 | 编写第一个Go程序
05 | 变量、常量以及与其他语言的差异
06 | 数据类型
07 | 运算符
08 | 条件和循环
09 | 数组和切片
10 | Map声明、元素访问及遍历
11 | Map与工厂模式,在Go语言中实现Set
12 | 字符串
13 | Go语言的函数
14 | 可变参数和defer
15 | 行为的定义和实现
16 | Go语言的相关接口
17 | 扩展与复用
18 | 不一样的接口类型,一样的多态
19 | 编写好的错误处理
20 | panic和recover
21 | 构建可复用的模块(包)
22 | 依赖管理
23 | 协程机制
24 | 共享内存并发机制
25 | CSP并发机制
26 | 多路选择和超时
27 | channel的关闭和广播
28 | 任务的取消
29 | Context与任务取消
30 | 只运行一次
31 | 仅需任意任务完成
32 | 所有任务完成
33 | 对象池
34 | sync.pool对象缓存
35 | 单元测试
36 | Benchmark
37 | BDD
38 | 反射编程
39 | 万能程序
40 | 不安全编程
41 | 实现pipe-filter framework
42 | 实现micro-kernel framework
43 | 内置JSON解析
44 | easyjson
45 | HTTP服务
46 | 构建RESTful服务
47 | 性能分析工具
48 | 性能调优示例
49 | 别让性能被锁住
50 | GC友好的代码
51 | 高效字符串连接
52 | 面向错误的设计
53 | 面向恢复的设计
54 | Chaos Engineering
55 | 结课测试&结束语
登录 后留言

全部留言(21)

  • 最新
  • 精选
SeeaYouL
package polymorphism import ( "fmt" "testing" ) type Code string type Programmer interface { WriteHelloWorld() Code } type GoProgrammer struct { } func (g GoProgrammer) WriteHelloWorld() Code { return "fmt.Println(\"Hello World!\")" } type JavaProgrammer struct { } func (j JavaProgrammer) WriteHelloWorld() Code { return "System.out.Println(\"Hello World!\")" } func WriteFirstProgrammer(p Programmer) { fmt.Printf("%T %v\n", p, p.WriteHelloWorld()) } func TestPolymorphism(t *testing.T) { goProg := GoProgrammer{} // goProg := new(GoProgrammer) javaProg := new(JavaProgrammer) WriteFirstProgrammer(goProg) WriteFirstProgrammer(javaProg) } 老师,为什么我这样写的输出结果没有报错? 输出如下: === RUN TestPolymorphism polymorphism.GoProgrammer fmt.Println("Hello World!") *polymorphism.JavaProgrammer System.out.Println("Hello World!") --- PASS: TestPolymorphism (0.00s) PASS coverage: 0.0% of statements ok _/E_/go_learning/src/ch12/polymorphic 0.233s Done

作者回复: 这是因为在Go Spec中有这样的定义 “The method set of the corresponding pointer type *T is the set of all methods declared with receiver *T or T (that is, it also contains the method set of T).“ 即指针类型可以访问定义在指针类型和值类型上的所有方法。可以参考这篇文章:https://suraj.io/post/golang-methods-interfaces/

2019-07-30
6
6
t7ink
既然是duck type类型,如果一个结构没有实现全部接口,那go编译器只会认为它是什么?

作者回复: 那就我当做那个接口的实现使用。所以,Go更提倡小接口(单个方法)大的接口有小接口组成

2019-03-17
3
Geek_338030
看了留言里说的那样改法后就可以将实例传入到WriteProgram()里了,那请问课中所说的interface类型只能传入指针类型还成立吗

作者回复: 嗯,只要是在结构上实现了interface的方法,则可以传入结构实例指针类型或者结构的实例。 如果方法是在结构的指针上实现的,则只能传入结构实例的指针。

2019-08-16
2
燕行
老师,你好,多态是polymorphism 不是 polymorphsim

作者回复: 非常感谢🙏指出

2019-11-26
1
贵州 IT民工
老师,switch这里case的值不是v的值,是表达式的嘛 还是.(type)的特殊写法呢

作者回复: 这里你可以简单的看作是GO的特殊写法。

2019-07-21
3
.Alter
老师您好,请问为何我写两段式的switch语句会报错呢? switch v := p.(type) ; v { // code } 会报:use of .(type) outside type switch .(type)是只可以用在switch语句中吗? 还有就是,这里面的v的返回结果是什么呢?可以用case判断类型,但打印出的是value值

作者回复: 这个为什么要用两段式呢,对于这个情况v后面的v有什么用呢?前面v已经被赋值并且可以在下面使用了。v的值是类型,你可以通过%T来输出

2019-03-18
jason-台北
interface,不只是能傳指針類型的實例,而是看您的實例有沒有實踐interface 的方法。
2019-04-05
3
18
慵懒的二狗
三分钟三十秒的时候,只说要new指针类型,根本就没讲为啥必须是声明指针类型,原理在哪。一路听下来感觉课程好几处都一带而过不讲清楚原理。课程质量不好。
2020-09-13
3
12
Jake
v := p.(type) type 是怎么来的?
2021-01-16
2
2
郭星
这里实现的多态实际是因为接口变量中存储了实例的结构体类型,因此在调用重写的方法时,实际调用的就是结构体中的方法
2020-07-10
2
收起评论