原文地址:元旦快乐~(Go面试题目)
1、以下代码会输出什么?请简要说明。
func main() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
time.Sleep(time.Millisecond)
wg.Done()
wg.Add(1)
}()
wg.Wait()
}
上述代码会发生panic恐慌,因为WaitGroup在调用Wait()之后是不能再调用Add()方法的。
2、以下代码会输出什么?请简要说明。
func main() {
fmt.Println(doubleScore(0))
fmt.Println(doubleScore(20.0))
fmt.Println(doubleScore(50.0))
}
func doubleScore(source float32) (score float32) {
defer func() {
if score < 1 || score >= 100 {
score = source
}
}()
return source * 2
}
上述代码会输出0 40 50,主要考的是defer语句与返回值相关内容,其次就是函数的return value操作它不是原子操作,而是在编译器中分解为两部分,分别是返回值赋值和return。
3、以下代码会输出什么?请简要说明。
var mu sync.RWMutex
var count int
func main() {
go A()
time.Sleep(2 * time.Second)
mu.Lock()
defer mu.Unlock()
count++
fmt.Println(count)
}
func A() {
mu.RLock()
defer mu.RUnlock()
B()
}
func B() {
time.Sleep(5 * time.Second)
C()
}
func C() {
mu.RLock()
defer mu.RUnlock()
}
上述代码会输出fatal error,因为当写锁阻塞时,新的读锁是无法申请的(有效防止写锁饥饿),上述操作会导致死锁。
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。