Code前端首页关于Code前端联系我们

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

terry 2年前 (2023-09-24) 阅读数 59 #后端开发
Golang学好并不难,腾讯工程师引你入门

作者:xixie,腾讯IEG后端开发工程师去年学过Golang,结果发现自己完全忘记了。吃好饭不怕迟到,于是又试了一次。学好Golang其实并不难。关键是要找到与其他语言不同而与百度上相同的微妙之处。然后就可以优雅的使用Golang了。下面将列出其他知识点。

特殊类型

1:空结构类型,空结构❙ⶶ♶❙Golang学好并不难,腾讯工程师引你入门

struct{}} 2:空接口 类型 接口{}

自动执行的函数

fun init(){}  // 会自动执行
  • 初始化函数在主函数之前自动执行,不能被其他函数调用;
  • init函数没有输入参数或返回值;
  • 每个包可以有多个init函数;
  • 每个包源文件还可以有多个init函数,比较奇怪;
  • 同一个包Golang的init执行顺序没有明确定义。编程时注意不要依赖该命令执行。
  • 各种包的init函数根据包导入的依赖关系决定执行顺序。

匿名函数

1:需要传递匿名函数的地方:

 once.Do(func() { // 该函数只会执行一次
  fmt.Println("Create Obj")
  singleInstance = new(Singleton)
 })

2:如果函数需要返回匿名函数:

type retFunc func()  // 通过 type 创建一个  别名

func xxx() retFunc{
 return func(){
  return 1;
 }
}

更残酷的匿名函数:'1:注意接口is interface xxx type{} 2: 传递给接口的点不能是指针 p *程序员要进入该接口,::返回值必须定义为 方法 interface{}

:
type Programmer interface {
    WriteHelloWorld() interface{}
}
注意:1:父接口只能是实例,不能是指针。可以认为父接口本身就是一个指针的实例 2:子类是使用指针/实例来实现的 遍历接口时,会将对应的指针实例传递给接口 3:一个接口通常只定义一个方法,尽量确保接口被简化

行为

1:行为定义当通过结构实现类型xxx类型xxx{}:2在 第一种:子类实现func(p * NoTypeProgrammer) WriteHelloWorld(),只能通过指针

// 将 子行为 传入接口
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())
}
调用,通过对象在变量或成员函数方法开头调用内部对象。 s

调用:

    noTypeProg := new(NoTypeProgrammer)
    writeFirstProgram(noTypeProg)
    //writeFirstProgram(NoTypeProgrammer{}) // error

第二种类型:子类实现 func (p oTypeProgrammer) WriteHelloWorld(),使用的指针 调用:

    noTypeProg := new(NoTypeProgrammer)
    writeFirstProgram(noTypeProg)
    writeFirstProgram(NoTypeProgrammer{}) // right

空接口

1:代表对象的空接口类型。类型必须根据语句

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")

2 进行评估:空接口可以接受任何类型的值: var interface yzjemptyinterface{} // 使用类型为empty的接口存储any type Value、space 类型的变量与弱类型语言中的变量非常相似。未初始化接口的默认初始值为零。

错误处理

1:使用多个返回值和错误码来判断程序处理;与 C 语言一样,错误代码通过引用或指针传递; [最好是返回码+参考];

模块

  • 同一目录下只能有一个包名;
  • 建议包名与目录名一致;
  • 每个包只能有一个同名的函数;
  • 同一个包内函数和变量可以任意调用,无需import

CSP

1:顺序进程通信:进程之间通过管道进行通信。

2:两种通道通信方式:

  • 缓冲通道:发送方和接收方连接较松;
  • 容量未满,输入留言的人可以继续输入;如果容量已满。直到接收者接受消息并且可以继续存储消息,才可以继续执行;
  • 接收器也类似:只要不为空,就可以接收消息并向下运行;如果没有消息,则必须等待,然后继续执行;

一个通道:channelstring intchannel int,只能输入一个值,且一次只能输入一个值。 ? 。 Golang学好并不难,腾讯工程师引你入门Golang学好并不难,腾讯工程师引你入门

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

3:主线程可以通过var wgsync.WaitGroup()管理多协程并发问题;

4:生产者和消费者之间通过生产者 close(chan)广播频道结束,Golang学好并不难,腾讯工程师引你入门

5: // 如果频道未关闭,则无限循环;

close (chan) 向其他协程广播 struct{}{} 空消息;

6:可用于任意任务完成的场景。

缓冲区会阻塞其他协程的写入。 N个协程创建N个Buffer,这是非阻塞的。7 Context

1:所有子协程都可以通过父协程取消( 通道外实现)。

Sync.Once.Do()

1:sync.OnceDo()‶‶‶‶‶‶♶

池对象

1 :如果需要将任何类型的数据放入对象池,就放入接口{}Golang学好并不难,腾讯工程师引你入门

sync.Pool

1:生命周期不可控,随时GCGolang学好并不难,腾讯工程师引你入门

长凳

1:Golang学好并不难,腾讯工程师引你入门

2:长凳只能作为参考。 运行次数因不同方式而异。

3:Bench用法

func BenchSyncmap(b *testing.B) {
 // bench 需要传入一个函数
 b.Run("map with RWLock", func(b *testing.B) {
  hm := CreateRWLockMap()
  benchMap(b, hm)
 })
}

Reflection

1:反射成员方法,编写更灵活的代码;

2:尤其是解析json的时候;

3:名称可能不同,但类型是相同的。【通用程序】

危险编程

1:类型转换Golang学好并不难,腾讯工程师引你入门

2:可以通过atomic.StorePointer()❙❙‶❙❙‶ omic.LoadPointer() 多个并发读写协程:

其实读写分为两个缓冲区:Golang学好并不难,腾讯工程师引你入门

pipe和Filter

1:定义接口Golang学好并不难,腾讯工程师引你入门

2:定义各个接口♾2:定义各个接口'和工厂方法 + 数据处理方法 【工厂方法在很多库中都有使用,这种设计方法可以成为固定公式❙串联:❙❓❙Golang学好并不难,腾讯工程师引你入门Golang学好并不难,腾讯工程师引你入门

比较常用的测试用例:

可以在需要测试的接口中插入各种实例: Golang学好并不难,腾讯工程师引你入门

经典接口实现示例【Golang的类组织方法使用Flatter的方法ⶶ❑〜 Golang学好并不难,腾讯工程师引你入门

创建对应的接口,最后调用: Golang学好并不难,腾讯工程师引你入门

microKernel

1:微服务模式,通用类管理子类流程; Golang学好并不难,腾讯工程师引你入门

JSON

1:传递struct tag比较容易分析,有点类似于那个通用程序;

2:easyjson需要手动生成marsh和unmarsh文件;

HTTP 服务

1:ROA:面向资源的架构Golang学好并不难,腾讯工程师引你入门

性能分析

1:通用性能调优流程:Golang学好并不难,腾讯工程师引你入门

2:通用性能指标:2:通用性能指标:2:

  • 2:处理器时间;
  • 3:出块时间;
  • 4:内存分配;
  • 5:GC次数/花费时间
  • 3:prof常用命令:

    • 1:显示CPU:
    go test -bench=.
    go test -bench=. -memprofile=mem.prof
    go tool pprof mem.prof
    top
    list function
    

    您还可以::2个相应的API,用于确定该函数是由prof文件准确编写的

    4:网络视图:http://localhost:8081/debug/pprof/

    5:影响性能的几点:文本和字符处理字符串拼接

    • json解析;
    • 字符串串联使用bytes.Buffer或strings.Builder

    协程锁:

    • 少用读锁;
    • 多使用并发map实现协程安全数据分享;

    GC友好的代码【尽量复用内存,减少内存分配】:

    • 对于大型数组和结构体,在函数中传递时使用指针;
    • 最好将切片初始化为合适的大小;或使用字段;

    面向错误的设计

    1:隔离错误:

    • 与设计隔离:微内核设计;
    • 物理隔离、分布;

    2:根据需要进行重用和冗余权衡;

    3:电流限制;

    4:快速拒绝比缓慢回应要好; (从网络的角度)

    5:不要永远等待;

    6:Breaker:用好Caching,合理的容错;

    面向恢复的设计

    1:谨防僵尸进程:常见资源耗尽和死锁;

    2:让它崩溃大多数都比恢复程序好(尽快找到bug解决);

    3:创建可恢复系统:

    • 拒绝一个实例;
    • 减少服务之间的依赖关系;
    • 快速启动;
    • 尝试无国籍;

    4:与客户配合客户同意访问频率,类似于限流;

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门