返回介绍

第一百零三天

发布于 2023-06-25 22:22:03 字数 1968 浏览 0 评论 0 收藏 0

1.下面代码输出什么?

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。

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

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()
}
  • A. 不能编译;
  • B. 输出 1;
  • C. 程序 hang 住;
  • D. fatal error;

参考答案及解析:D。当写锁阻塞时,新的读锁是无法申请的(有效防止写锁饥饿),导致死锁。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文