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 语言从入门到实战
登录|注册
留言
22
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 16 | Go语言的相关接口
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 | 结课测试&结束语
登录 后留言

全部留言(22)

  • 最新
  • 精选
三年级2班 陈同学
作为 PHPer 总用java来讲我也很懵啊

作者回复: 不用担心,多看看我给的例子,多改多试

2019-09-01
2
7
哇哈哈
把参数从interface指针换成interface就可以了,但是之前说的传指针是一种好习惯可以避免对象的拷贝,所以很不理解这里为什么用interface指针就不可以

作者回复: 之所以穿指针是为了数据复制,interface是协议定义并不包含数据

2019-04-03
3
5
青鸟飞鱼
老师你好,为什么Programmer要new,我测试不new的话,编译不过,想不通

作者回复: 因为借口类型需要对应的是指针类型的实例。new返回的就是指向实例的指针

2020-10-04
4
iMARS
//定义一个抽象的动物类接口 type IAnimal interface { Say(msg string) string } type Duck struct { Name string } type Dog struct { Name string } func (duck *Duck) Say(msg string) string { return fmt.Sprintf("duck duck! my name is %s,%s", duck.Name, msg) } func (dog *Dog) Say(world string) string { return fmt.Sprintf("wang wang! my name is %s,%s", dog.Name, msg) } func TestAnimal(t *testing.T) { dog1 := Dog{Name: "Kitty"} var zoo = make([]IAnimal, 10, 20) animal := append(zoo, dog1) t.Log(animal) } 为何最后两句会报 cannot use dog1 (type Dog) as type IAnimal in append: Dog does not implement IAnimal (Say method has pointer receiver) 求指点!谢谢。

作者回复: 这里要用指针才行: animal := append(zoo, &dog1)

2019-09-20
3
4
春春家的雷雷
接口是定义多个对象之间交互的协议?不是太懂,这个有点蒙,老师能不能再稍微解释一下,接口对我们开发有什么指导意义吗?为什么要有接口呢,我只是知道接口定义了类的行为,必须实现哪些动作才能实现这个接口,这样有什么意思吗?还是不懂,望老师指点

作者回复: 通常先定义两个模块交互的方法,这些方法定义在接口里。然后,模块都依赖于接口。各模块的分别实现自己的,接口就像协议。

2019-06-11
2
4
甘康艺
老师请教一个问题,该节课最后谈到的自定义类型里面,返回值类型为什么使用自定义类型会出错? type IntConv func(op int) int func timeSpent(inner IntConv) IntConv { return func(n int) int { //此处 func(n int) int 用 IntConv代替会出错 start := time.Now() ret := inner(n) fmt.Println("time spent: ", time.Since(start).Seconds()) return ret } }

作者回复: 函数定义是必须按照函数签名展开的

2020-10-12
3
3
逗逼师父
老师您好,结合之前的知识点:go不支持隐式类型转换,我有些疑问,我的代码如下,也是我思考问题的思路: 代码块1: type MyInt int func myFunc(op int) MyInt { // 明显,go不支持隐式类型转换,所以编译是不会通过的 return op } 代码块2: // 原始代码 func timeSpent(inner func(op int) int) func(op int) int { return func(n int) int { start := time.Now() ret := inner(n) fmt.Println("time spent: ", time.Since(start).Seconds()) return ret } } type IntConv func(op int) int // 改良代码1 func timeSpent1(inner IntConv) IntConv { // 我总觉得这里就是一种隐式转换 // 但是函数不是数据类型,所以不受隐式类型转换规则的约束 return func(n int) int { start := time.Now() ret := inner(n) fmt.Println("time spent: ", time.Since(start).Seconds()) return ret } } // 改良代码2 func timeSpent2(inner IntConv) IntConv { // 于是,我想到了一种算是“显示”转换的方式,代码如下: intConv := *new(IntConv) intConv = func(op int) int { start := time.Now() ret := inner(op) fmt.Println("time spent: ", time.Since(start).Seconds()) return ret } return intConv } 我的疑问在于: 1. 我对显示转换和隐式转换的理解是否有误,如果有误的话,是错在哪里了? 2. timeSpent1和timeSpent2函数都实现了原有功能,只是实现方式不同,那么它们更深层次的区别是什么,比如是不是会有额外的内存消耗之类的? 提问完毕,期待老师的解答,谢谢。

作者回复: 这里是方法类型的定义,就像你定义struct,这里不是类型转化。 至于性能和消耗,接下我的课程会讲如何benchmark代码,留给你自己实验分析得出结论,并分享给大家

2019-03-15
2
风骑
有个问题,老师,如果我用多个方法去实现这个接口函数的话,如下面的例子: package interface_test import "testing" type Programmer interface { WriteHelloWorld() string } type GoProgrammer struct { } type GoSecProgrammer struct { } func (g *GoProgrammer) WriteHelloWorld() string { return "fmt.Println(\"Hello World\")" } func (g *GoSecProgrammer) WriteHelloWorld() string { return "fmt.Println(\"Hello World,too\")" } func TestClient(t *testing.T) { var p Programmer p = new(GoProgrammer) t.Log(p.WriteHelloWorld()) var g Programmer g = new(GoSecProgrammer) t.Log(g.WriteHelloWorld()) } 那这个就算是重载了吧

作者回复: 你想说的是override吧,是指子类覆盖父类的方法,至于overload是指同一个类中方法名相同,但参数不同的方法。 上面代码,并不属于这些,只是同一接口的不同实现。

2020-01-17
2
哇哈哈
type Programmer interface { WriteHW() string } type GoProgrammer struct { } func write_sth(p *Programmer) string { return p.WriteHW() } 这段代码在write_sth出错,报错为“p.WriteHW undefined (type *Programmer is pointer to interface, not interface)” 请问下为什么不能使用一个interface的指针作为传入参数? 我的目的是为了让所有实现了这个接口的struct都能用来调用这个write_sth函数

作者回复: 改为func write_sth(p Programmer)

2019-04-03
6
3Golds
建议老师不要总用java来讲
2019-03-21
4
63
收起评论