Golang——异常和error

Go语言没有传统的try/catch异常处理,而是通过panic和recover机制以及error接口来处理错误。panic会导致程序中断,而recover可以在defer中捕获异常以确保程序正常退出。当遇到错误情况时,如空指针、数组越界等,Go会自动触发panic。为避免服务因小错误挂起,通常推荐使用error接口自定义错误,并记录日志,而不是直接panic。自定义error需要实现error接口的方法,注意方法的接收者类型对值的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Go 提供了两种处理错误 方式,
一 种是借助 panic和 recover 的抛出捕获机制,
另一种使用error 错误类型

一、异常
1、go没有try/catch,而是使用panic/recover。
panic包出异常,后续代码不再执行
recover再defer中捕获异常,使groutine(即程序)能够正常退出。

1)只有panic,而没有recover,程序宕机无法正常退出

package main

import "fmt"

func send(a, b int) int {
   
	if b == 0 {
   
		panic("wrong div")
	}
	c := a / b
	return c
}

func main() {
   
	defer func() {
   
		fmt.Println("wrong")
	}()
	send(1, 0)
}

执行结果:错误在这里插入图片描述
2) 正确情况,使用panic、recover

package main

import "fmt"

func send(a,
### 在 Golang 中生成随机数 在 Golang 中生成随机数通常依赖于标准库中的 `math/rand` `crypto/rand` 包。下面详细介绍两种方式及其具体应用。 #### 使用 `math/rand` 包生成伪随机数 `math/rand` 提供了一组用于生成伪随机数的函数,这些函数基于线性同余发生器(LCG)。如果不设置种子,程序每次运行都会得到相同的随机数序列。因此,在大多数情况下都需要调用 `rand.Seed()` 来初始化随机数生成器。 ```go package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) // 设置随机数种子[^1] randomInt := rand.Intn(10) // 生成范围为 [0, 10) 的整数 fmt.Println("Random Integer:", randomInt) randomFloat := rand.Float64() // 生成范围为 [0.0, 1.0) 的浮点数 fmt.Println("Random Float:", randomFloat) permutedNumbers := rand.Perm(5) // 返回一个打乱顺序后的前 N 个自然数列表 fmt.Println("Permuted Numbers:", permutedNumbers) } ``` 以上代码展示了如何生成不同类型的随机数值以及如何创建一组排列好的随机数列[^3]。 #### 利用 `crypto/rand` 实现更强安全性需求下的随机数据生成 当应用程序涉及到密码学用途时,应该选择更为安全可靠的随机源。此时推荐使用来自 `crypto/rand` 包内的功能,因为它们提供了操作系统层面的安全熵池支持,从而能够提供更高品质的随机比特流。 下面是关于怎样借助该包构建任意长度字节数组的例子: ```go package main import ( "crypto/rand" "encoding/hex" "fmt" "log" ) func generateSecureToken(length int) (string, error) { tokenBytes := make([]byte, length) _, err := rand.Read(tokenBytes) // 将随机字节读入到 tokenBytes 数组中[^2] if err != nil { return "", err } return hex.EncodeToString(tokenBytes), nil } func main() { tokenStr, err := generateSecureToken(16) // 创建具有指定大小的安全令牌字符串表示形式 if err != nil { log.Fatal(err) } fmt.Println("Generated Secure Token:", tokenStr) } ``` 这里我们定义了一个辅助函数 `generateSecureToken` ,它接受期望获得的字节数作为参数,并返回经过十六进制编码处理过的最终结果。如果遇到任何异常状况,则停止执行并向终端打印错误消息。 --- 总结而言,针对普通的非敏感型应用场景可以选择效率较高的 `math/rand` 解决方案;而一旦牵涉到加密运算等领域的时候就务必切换至具备充分安全保障特性的替代品 —— 即 `crypto/rand` 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值