天天看点

Go 面试每天一篇(第 103 天)

你好哇,欢迎来答题,一起来看下昨天题目的解析:

1.ch := make(chan interface{}) 和 ch := make(chan interface{},1) 有什么区别?

参考答案及解析:第一个是声明无缓存通道,第二个是声明缓存为 1 的通道。无缓存通道需要一直有接收者接收数据,写操作才会继续,不然会一直阻塞;而缓冲为 1 则即使没有接收者也不会阻塞,因为缓冲大小是 1 ,只有当放第二个值的时候,第一个还没被人拿走,这时候才会阻塞。注意这两者还是有区别的。

2.下面的代码输出什么?请简要说明。

1var mu sync.Mutex      2var chain string      3      4func main() {      5    chain = "main"      6    A()      7    fmt.Println(chain)      8}      9func A() {     10    mu.Lock()     11    defer mu.Unlock()     12    chain = chain + " --> A"     13    B()     14}     15     16func B() {     17    chain = chain + " --> B"     18    C()     19}     20     21func C() {     22    mu.Lock()     23    defer mu.Unlock()     24    chain = chain + " --> C"     25}      
  • A. 不能编译;
  • B. 输出 main --> A --> B --> C;
  • C. 输出 main;
  • D. fatal error;

参考答案即解析:D。使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁。

引自博客《鸟窝》 https://colobu.com/

解析若有不妥之处,欢迎在留言区交流、指正!

看下今天的题目:

1.下面代码输出什么?

1func main() {      2    fmt.Println(doubleScore(0))          3    fmt.Println(doubleScore(20.0))       4    fmt.Println(doubleScore(50.0))       5}      6func doubleScore(source float32) (score float32) {      7    defer func() {      8        if score < 1 || score >= 100 {      9            score = source     10        }     11    }()     12    return source * 2     13}      

2.下面代码输出什么?请简要说明。

1var mu sync.RWMutex      2var count int      3      4func main() {      5    go A()      6    time.Sleep(2 * time.Second)      7    mu.Lock()      8    defer mu.Unlock()      9    count++     10    fmt.Println(count)     11}     12func A() {     13    mu.RLock()     14    defer mu.RUnlock()     15    B()     16}     17func B() {     18    time.Sleep(5 * time.Second)     19    C()     20}     21func C() {     22    mu.RLock()     23    defer mu.RUnlock()     24}      
  • B. 输出 1;
  • C. 程序 hang 住;

答案以及解析会在下一篇文章中给出,鼓励大家在留言区留下答案,抱团学习,日拱一卒,每天进步一点!

Go 面试每天一篇(第 103 天)
Go 面试每天一篇(第 103 天)

继续阅读