学好Golang并不难,腾讯工程师给你介绍一下

作者:xixie,腾讯IEG后端开发工程师去年学过Golang,结果发现自己完全忘记了。吃好饭不怕迟到,于是又试了一次。学好Golang其实并不难。关键是要找到与其他语言不同而与百度上相同的微妙之处。然后就可以优雅的使用Golang了。下面将列出其他知识点。
特殊类型
1:空结构类型 1:需要传递匿名函数的地方: 2:如果函数需要返回匿名函数: 更残酷的匿名函数:'1:注意接口is 1:行为定义当 调用: 第二种类型:子类实现 1:代表对象的空接口类型。类型必须根据语句 2 进行评估:空接口可以接受任何类型的值: var interface yzjemptyinterface{} // 使用类型为empty的接口存储any type Value、space 类型的变量与弱类型语言中的变量非常相似。未初始化接口的默认初始值为零。 1:使用多个返回值和错误码来判断程序处理;与 C 语言一样,错误代码通过引用或指针传递; [最好是返回码+参考]; 1:顺序进程通信:进程之间通过管道进行通信。 2:两种通道通信方式: 一个通道: 3:主线程可以通过 4:生产者和消费者之间通过生产者 5: // 如果频道未关闭,则无限循环; 6:可用于任意任务完成的场景。 缓冲区会阻塞其他协程的写入。 N个协程创建N个Buffer,这是非阻塞的。7 Context 1:所有子协程都可以通过父协程取消( 通道外实现)。 1: 1 :如果需要将任何类型的数据放入对象池,就放入 1:生命周期不可控,随时GC 1: 2:长凳只能作为参考。 运行次数因不同方式而异。 3:Bench用法 1:反射成员方法,编写更灵活的代码; 2:尤其是解析json的时候; 3:名称可能不同,但类型是相同的。【通用程序】 1:类型转换 2:可以通过 其实读写分为两个缓冲区: 1:定义接口 2:定义各个接口♾2:定义各个接口'和工厂方法 + 数据处理方法 【工厂方法在很多库中都有使用,这种设计方法可以成为固定公式❙串联:❙❓❙ 比较常用的测试用例: 可以在需要测试的接口中插入各种实例: 经典接口实现示例【Golang的类组织方法使用Flatter的方法ⶶ❑〜 创建对应的接口,最后调用: 1:微服务模式,通用类管理子类流程; 1:传递struct tag比较容易分析,有点类似于那个通用程序; 2:easyjson需要手动生成marsh和unmarsh文件; 1:ROA:面向资源的架构 1:通用性能调优流程: 2:通用性能指标:2:通用性能指标:2: 3:prof常用命令: 您还可以::2个相应的API,用于确定该函数是由prof文件准确编写的 4:网络视图: 5:影响性能的几点:文本和字符处理字符串拼接 协程锁: GC友好的代码【尽量复用内存,减少内存分配】: 1:隔离错误: 2:根据需要进行重用和冗余权衡; 3:电流限制; 4:快速拒绝比缓慢回应要好; (从网络的角度) 5:不要永远等待; 6:Breaker:用好Caching,合理的容错; 1:谨防僵尸进程:常见资源耗尽和死锁; 2:让它崩溃大多数都比恢复程序好(尽快找到bug解决); 3:创建可恢复系统: 4:与客户配合客户同意访问频率,类似于限流; ,空结构❙ⶶ♶❙
struct{}} 2:空接口 类型
: 接口{}
自动执行的函数
fun init(){} // 会自动执行
匿名函数
once.Do(func() { // 该函数只会执行一次
fmt.Println("Create Obj")
singleInstance = new(Singleton)
})
type retFunc func() // 通过 type 创建一个 别名
func xxx() retFunc{
return func(){
return 1;
}
}
interface xxx type{}
2: 传递给接口的点不能是指针 p *程序员
要进入该接口,::返回值必须定义为 方法 interface{}
注意:1:父接口只能是实例,不能是指针。可以认为父接口本身就是一个指针的实例 2:子类是使用指针/实例来实现的 遍历接口时,会将对应的指针实例传递给接口 3:一个接口通常只定义一个方法,尽量确保接口被简化:type Programmer interface {
WriteHelloWorld() interface{}
}
行为
通过
结构实现类型xxx类型xxx{}:2在 第一种:子类实现
func(p * NoTypeProgrammer) WriteHelloWorld()
,只能通过指针
调用,通过对象在变量或成员函数方法开头调用内部对象。 s // 将 子行为 传入接口
type NoTypeProgrammer struct {
}
// 标识,要看最终这里的实现 !!!
func (p *NoTypeProgrammer) WriteHelloWorld() string {
return "System.out.Println(\"Hello World!\")"
}
// 传入接口的 方法, 这里传 指针or实例都可以的
func writeFirstProgram(p Programmer) {
fmt.Printf("%T %v\n", p, p.WriteHelloWorld())
}
noTypeProg := new(NoTypeProgrammer)
writeFirstProgram(noTypeProg)
//writeFirstProgram(NoTypeProgrammer{}) // error
func (p oTypeProgrammer) WriteHelloWorld(),使用的指针 调用:
noTypeProg := new(NoTypeProgrammer)
writeFirstProgram(noTypeProg)
writeFirstProgram(NoTypeProgrammer{}) // right
空接口
func DoSomething(p interface{}) {
switch v := p.(type) {
case int:
fmt.Println("Integer", v)
case string:
fmt.Println("String", v)
default:
fmt.Println("Unknow Type")
}
}
// 使用
DoSomething("10")
错误处理
模块
CSP
channelstring
、 intchannel int
,只能输入一个值,且一次只能输入一个值。 ? 。 sequenceDiagram
main ->> main:
main ->> + AsyncService : 异步执行
main ->> +otherTask: 和 AsyncService 同步执行
otherTask-->>- main: return
main ->> main: 等待 <-channel
AsyncService ->> AsyncService: sleep
AsyncService ->> AsyncService: sleep
AsyncService ->>main: retCh <- ret, 通道在左边,是给通道赋值
main ->> main: 唤起执行
AsyncService ->>AsyncService: 继续执行
main ->> main: End
AsyncService ->>AsyncService: 继续执行
AsyncService -->>- main: return
var wgsync.WaitGroup()
管理多协程并发问题; close(chan)
广播频道结束,close (chan)
向其他协程广播 struct{}{}
空消息; Sync.Once.Do()
sync.Once
的Do()‶‶‶‶‶‶♶
池对象
接口{}
sync.Pool
长凳
func BenchSyncmap(b *testing.B) {
// bench 需要传入一个函数
b.Run("map with RWLock", func(b *testing.B) {
hm := CreateRWLockMap()
benchMap(b, hm)
})
}
Reflection
危险编程
atomic.StorePointer()❙❙‶❙❙‶ omic.LoadPointer()
多个并发读写协程:pipe和Filter
microKernel
JSON
HTTP 服务
性能分析
go test -bench=.
go test -bench=. -memprofile=mem.prof
go tool pprof mem.prof
top
list function
http://localhost:8081/debug/pprof/
面向错误的设计
面向恢复的设计
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。