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

更新日期: 2024-05-30 阅读次数: 1023 字数: 325 分类: golang

一段用于 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 聊聊, 查看更多联系方式