Keal's Blog

我的天空, 是雨是风

Tencent interview

事情的开始,是11.15早上,接到了腾讯HR的电话,约了11-16晚上的面试。 毕竟腾讯是我在国内最喜欢的公司, 国内几个大厂里,阿里给我的感觉像个成熟大叔,什么都懂但是很无趣。字节跳动像个蛮劲很大的年轻人,只有腾讯给我的感觉是年轻自由且开放的。虽然还没有打算跳槽,但是我没法拒绝腾讯的第一次邀请. 接到面试后,整个人的状态就变了。变得紧张,兴奋,和担忧。后果是引发了情绪性胃炎,直到我码字...

从gRPC源码学习Golang默认参数和可变参数的使用

Golang默认参数和可变参数 Golang函数支持默认参数吗?No Golang函数支持可变参数吗?Yes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package main import "fmt" //可变参数的声明 func test(a ...int) { var total int...

Golang之array,slice,map的底层实现

Slice, Map

Array Array即常说的数组数据类型. Golang中的数组类型由两个部分组成,即元素类型和数组长度.例如 [10]int 10个int元素类型的数组 [10]string 10个string元素类型的数组 即使元素类型相同, 但是数组长度不同,在Golang中也被视为是类型不一样. 声明数组 1 2 arr1 := [3]int{1, 2, 3} arr2 := [...

Golang的踩坑记录

记录Golang一些小坑,避免 uint类型直接相减如果是负数,会得到一个非常大的值 gorm更新时如果使用orm去更新会忽略类型的零值,比如将某个int类型改为0时,会被忽略. goroutine中如果不注意panic的话可能会导致整个程序的崩溃 小心在循环中直接使用临时变量,循环中的临时变量复用了地址,而循环的执行顺序问题会使得程序运行情况不一定符合预期

Golang之Channel

"channel chan?"

Channel channel是golang实现的”通过通信来实现共享内存”并发同步方案. Channel有点类似python里的Queue, 例如内部通过锁的机制实现了并发安全.遵循先入先出的设计. Channel的三种类型: 同步 Channel — 不需要缓冲区,发送方会直接将数据交给(Handoff)接收方; 异步 Channel — 基于环形缓存的传统生产者消费者...

Golang之context

"context for ?"

Context 1 2 3 4 5 6 type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{} } 通过Go源码可知,Context接口需要实现Deadlin...

Golang之select

"select for ?"

Select select的使用方式和switch有点类似,作用和io多路复用里的select函数类似. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 func fibonacci(c, quit chan int) {...

Golang之类型比较

"go type compare"

普通类型比较 可比较:Integer,Floating-point,String,Boolean,Complex,Pointer,Channel,Interface,Array 不可比较:Slice,Map,Function Struct类型比较 相同的struct: 内部不含有不可比较类型的成员变量则可以直接比较 内部含有不可比较类型的成员变量不可直接比较, ...

Golang之defer

"defer"

Defer defer关键字的主要作用是指定一个在函数返回前执行的函数.最常见的使用就是释放锁,关闭文件描述符,释放数据库连接. 这里主要讲两个问题: defer 关键字的调用时机以及多次调用 defer 时执行顺序是如何确定的; defer 关键字使用传值的方式传递参数时会进行预计算,导致不符合预期的结果; 1 2 3 4 5 6 7 8 9 10 11 12 func...

Golang之go的调度

"go, use go"

Go调度 系统级别的调度依然是 进程和线程.虽然线程比较轻量,但是在调度时也有比较大的额外开销。每个线程会都占用 1M 以上的内存空间,在切换线程时不止会消耗较多的内存,恢复寄存器中的内容还需要向操作系统申请或者销毁资源,每一次线程上下文的切换都需要消耗 ~1us 左右的时间1,但是 Go 调度器对 Goroutine 的上下文切换约为 ~0.2us,减少了 80% 的额外开销2。 图-...