[govet] misuse of unbuffered os.Signal channel as argument to signal.Notify

文章目录

    一段用于 gin gracefully shutdown 的代码在使用 govet 检查时,报 error 错误。
    但是,这个错误在编译时,并不会报错,不影响编译,我就一直没管。

    然而这个炎热的夏天,我实在忍不住了,今天在 VIM 中看到底部这个一直显示的,无法消除的 govet 错误,心情暴躁的我决定毁灭它。

    报错信息

    [govet] misuse of unbuffered os.Signal channel as argument to signal.Notify [Error]

    报错代码

    // Wait for interrupt signal to gracefully shutdown the server with
    // a timeout of 5 seconds.
    quit := make(chan os.Signal)
    // kill (no param) default send syscanll.SIGTERM
    // kill -2 is syscall.SIGINT
    // kill -9 is syscall. SIGKILL but can"t be catch, so don't need add it
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <-quit
    log.Println("Shutdown Server ...")
    

    具体报错行在 signal.Notify 这行。

    参考:

    https://pkg.go.dev/os/signal#Notify

    package main
    
    import (
    	"fmt"
    	"os"
    	"os/signal"
    )
    
    func main() {
    	// Set up channel on which to send signal notifications.
    	// We must use a buffered channel or risk missing the signal
    	// if we're not ready to receive when the signal is sent.
    	c := make(chan os.Signal, 1)
    	signal.Notify(c, os.Interrupt)
    
    	// Block until a signal is received.
    	s := <-c
    	fmt.Println("Got signal:", s)
    }
    

    解决方法

    修改为:

    quit := make(chan os.Signal, 1)
    

    然后,世界清净了。

    golang 版本

    go.mod

    go 1.18
    

    go 版本:

    > go version
    go version go1.18 linux/amd64
    

    参考

    • https://github.com/edgexfoundry/go-mod-bootstrap/issues/300
    • https://blog.csdn.net/zkt286468541/article/details/126016095

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式