:= 和 var
- 短变量声明:使用 := 操作符可以在不显式指定变量类型的情况下,根据右侧的表达式自动推断变量类型。这种方法声明和定义绑定在一起一步到位。
name := "Pey"
- var:go中定义过的变量必须使用,不然会报错。使用var既可以只声明变量,也可以同时定义变量。
var name string // 只声明
var name string = "Pey" // 同时定义
Tips: 声明全局变量(包级别变量)一般只能用var(在func之外声明)
panic, recover, defer
defer 语句用于注册一个函数调用,在包含它的函数结束时执行,无论正常结束还是发生异常。这使得资源释放等操作更容易管理。
-
panic
:panic
用于引发异常(panic),表示程序发生了不可恢复的错误。当程序出现无法处理的错误时,可以使用panic
来停止程序的正常执行,并立即终止当前函数的执行流程。panic
接受一个任意类型的参数,通常是用来描述导致异常的原因。示例:
Codefunc divide(a, b int) int { if b == 0 { panic("除数不能为零") } return a / b } func main() { fmt.Println(divide(10, 0)) }
在上述示例中,当除数
b
的值为 0 时,会触发一个panic
,并传递描述信息 "除数不能为零"。这将导致程序的执行立即停止,并抛出一个运行时异常。 -
recover
:recover
用于捕获并处理panic
引发的异常。它只能在defer
函数中被调用,并且可以用于恢复程序的正常执行流程。当recover
被调用时,它会返回导致panic
的错误信息,如果没有发生panic
,recover
返回nil
。示例:
Codefunc divide(a, b int) (result int, err error) { defer func() { if r := recover(); r != nil { err = fmt.Errorf("发生了错误:%v", r) } }() if b == 0 { panic("除数不能为零") } return a / b, nil } func main() { result, err := divide(10, 0) if err != nil { fmt.Println(err) } else { fmt.Println("结果:", result) } }
在上述示例中,通过使用
defer
关键字延迟执行匿名函数,并在其中调用recover()
函数。在函数内部,我们检查recover
的返回值是否为nil
,如果不为nil
,则说明发生了panic
,我们可以在此处捕获到异常并进行处理。
需要注意的是,panic
可以逐层向上传播,直到被恢复或者程序终止。通常情况下,panic
应该被视为一种无法恢复的错误,并且应该仅在遇到真正严重的问题时使用。使用 recover
来处理 panic
是一种可选的方式,可以用来优雅地处理某些特定场景下的异常情况。
一个recover可以捕获多个不同panic(不同时)
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到panic:", r)
}
}()
go func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到panic:", r)
}
}()
panic("第一个panic")
}()
go func() {
panic("第二个panic")
}()
time.Sleep(time.Second) // 等待goroutines执行完成
}
range 循环:
range 关键字可以用于遍历数组、切片、字符串、字典等数据结构,提供了一种简洁的方式来迭代元素。例如:
Codenumbers := []int{1, 2, 3, 4, 5}
// i 为索引
for i, num := range numbers {
fmt.Println(i, num)
}
struct 字面量初始化
在初始化结构体时,可以省略字段名称,只提供对应的值列表。编译器会根据字段的顺序进行匹配赋值。例如:
type Person struct {
Name string
Age int
}
Codeperson := Person{"John", 30} // 可以省略 Person{Name: "John", Age: 30}
标签:defer,nil,fmt,语法,func,Go,recover,panic
From: https://www.cnblogs.com/peychou/p/17645802.html