golang 拦截恐慌
时间: 2023-07-26 07:29:36 浏览: 58
在 Go 语言中,可以使用 `recover()` 函数来拦截恐慌。`recover()` 函数只能在 defer 函数中使用,用于捕获 panic,并返回 panic 的值。如果没有 panic,`recover()` 函数返回 nil。
下面是一个简单的示例:
```
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
// 代码可能会引发 panic
}
```
在上面的代码中,我们使用了 defer 函数来定义一个匿名函数,该函数包含了 `recover()` 函数。当代码引发 panic 时,该匿名函数会被执行并捕获 panic,打印出 panic 的值。如果代码没有引发 panic,则该匿名函数不会被执行,`recover()` 函数返回 nil。
相关问题
golang拦截器gin
以下是使用gin框架编写拦截器的示例代码:
```go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// 注册拦截器
router.Use(checkToken)
// 定义路由
router.GET("/hello", func(c *gin.Context) {
c.String(200, "Hello, World!")
})
// 启动服务
router.Run(":8080")
}
// 定义拦截器
func checkToken(c *gin.Context) {
fmt.Println("进入拦截器")
// 编写过滤的逻辑,token校验等
// c.Next():放行执行后续动作
// c.Abort():不执行后续动作
c.Next()
}
```
在上面的代码中,我们首先导入了gin包,然后创建了一个默认的gin引擎。接着,我们使用`router.Use(checkToken)`注册了一个名为checkToken的拦截器。最后,我们定义了一个路由,当访问/hello时,返回"Hello, World!"。在checkToken函数中,我们可以编写过滤的逻辑,例如token校验等。
golang 实现icmp协议拦截
要实现 ICMP 协议拦截,可以使用 golang 的 net 包中的 RawConn 类型。以下是一个简单的示例代码:
```go
package main
import (
"fmt"
"golang.org/x/net/icmp"
"golang.org/x/net/ipv4"
"log"
"net"
)
func main() {
conn, err := net.ListenPacket("ip4:icmp", "0.0.0.0")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
rawConn, err := ipv4.NewRawConn(conn)
if err != nil {
log.Fatal(err)
}
buf := make([]byte, 1024)
for {
n, _, addr, err := conn.ReadFrom(buf)
if err != nil {
log.Fatal(err)
}
msg, err := icmp.ParseMessage(1, buf[:n])
if err != nil {
log.Fatal(err)
}
switch msg.Type {
case ipv4.ICMPTypeEcho:
fmt.Printf("Received ICMP echo request from %v\n", addr)
// Do something to intercept the ICMP echo request
default:
fmt.Printf("Received ICMP message from %v with type %d\n", addr, msg.Type)
}
}
}
```
上述代码使用 net.ListenPacket 创建一个监听 ICMP 协议的连接,并通过 ipv4.NewRawConn 将其转换为 RawConn 类型。然后,它使用 conn.ReadFrom 读取传入的 ICMP 数据包,并通过 icmp.ParseMessage 解析消息类型。如果消息类型是 ICMP echo,则打印出接收到 ICMP echo 请求的地址,并在此处添加拦截逻辑。否则,打印出接收到的 ICMP 消息类型。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)