Golang 教程
Golang 控制语句
Golang 函数 & 方法
Golang 切片 & 数组
Golang 结构体
Golang 字符串
Golang 接口
Golang 指针
Golang 并发
Golang 异常(Error)
Golang 其他杂项

Go Select语句和deadlock死锁

时间:2023年06月10日 阅读:192
以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性,因使用而带来的风险与本站无关!
淘客轩-衣食住行外卖生活好助手

在Go语言中,select语句就像switch语句,但是在select语句中,case语句引用通信,即通道上的发送或接收操作。

语法:

select{
    case SendOrReceive1: // 语句
    case SendOrReceive2: // 语句
    case SendOrReceive3: // 语句
    .......
    default: // Statement
 }

在本文中,我们将学习如何使用默认情况来避免死锁。但是首先,我们了解什么是deadlock?

死锁:当您试图从通道读取或写入数据但通道没有值时。因此,它阻塞goroutine的当前执行,并将控制传递给其他goroutine,但是如果没有其他goroutine可用或其他goroutine睡眠,由于这种情况,程序将崩溃。这种现象称为死锁。如下面的实例所示:

package main

func main() {

    //创建通道
    //出现死锁是因为没有goroutine在写
    //因此,select语句被永远阻塞
    c := make(chan int)
    select {
    case <-c:
    }
}

输出:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()

为了避免这种情况,我们在select语句中使用默认case。换句话说,当程序中出现死锁时,将执行select语句的默认情况以避免死锁。如下例所示,我们在select语句中使用默认情况以避免死锁。

package main 
  
import "fmt"
  
func main() { 
  
    //创建通道
    c := make(chan int) 
    select { 
    case <-c: 
    default: 
        fmt.Println("!.. Default case..!") 
    } 
}

输出:

!.. Default case..!

当select语句只有nil通道时,也允许使用默认情况。如下面的实例所示,通道c是nil,所以默认情况下执行,如果这里的默认情况是不可用的,那么程序将永远被阻塞,死锁出现。

package main

import "fmt"

func main() {

    //创建通道
    var c chan int

    select {
    case x1 := <-c:
        fmt.Println("Value: ", x1)
    default:
        fmt.Println("Default case..!")
    }
}

输出:

Default case..!
打赏

本文地址:https://www.momojc.cn/golang/golang-deadlock-and-default-case-in-select-statement.html

关于本站 | 隐私政策 | 免责声明 | 广告合作 | 我要投稿 | 后台管理

CopyRight © 2023-2024 MOMO教程 WWW.MOMOJC.CN , All Rights Reserved.

站长E-mail:378074730@qq.com 网站已运行:  运行时长:0.036 秒

京ICP备20029690号-1京ICP备20029690号-2 京公网安备11011402013892号京公网安备11011402013892号 中国互联网违法和不良信息举报中心 网络违法犯罪举报网站

本网站托管于 腾讯云 .由网站卫士提供网站加速和攻击防御服务 提供CDN加速/防御服务.由zblogcn强力驱动 又拍云提供CDN加速/云存储服务 51la网站统计