设为首页 加入收藏

TOP

Go语法糖
2023-09-09 10:25:40 】 浏览:88
Tags:

:= ,var 和 make

  1. 短变量声明:使用 := 操作符可以在不显式指定变量类型的情况下,根据右侧的表达式自动推断变量类型。这种方法声明和定义绑定在一起一步到位。
name := "Pey"
  1. var:go中定义过的变量必须使用,不然会报错。使用var既可以只声明变量,也可以同时定义变量。
var name string						// 只声明
var name string = "Pey"		// 同时定义

Tips: 声明全局变量(包级别变量)一般只能用var(在func之外声明)

  1. make:用来初始化slice,map,channel。make 在编译时被替换成对应类型的构造函数。具体地说,编译器会根据 make 函数传入的参数类型,在编译时将其替换成对应类型的构造函数调用。
slice := make([]int, len, cap)
map := make(map[int]int, cap)
channel := make(chan int, cap)

panic, recover, defer

defer 语句用于注册一个函数调用,在包含它的函数结束时执行,无论正常结束还是发生异常。这使得资源释放等操作更容易管理。

  1. panicpanic 用于引发异常(panic),表示程序发生了不可恢复的错误。当程序出现无法处理的错误时,可以使用 panic 来停止程序的正常执行,并立即终止当前函数的执行流程。panic 接受一个任意类型的参数,通常是用来描述导致异常的原因。

    示例:

    func divide(a, b int) int {
        if b == 0 {
            panic("除数不能为零")
        }
        return a / b
    }
    
    func main() {
        fmt.Println(divide(10, 0))
    }
    

    在上述示例中,当除数 b 的值为 0 时,会触发一个 panic,并传递描述信息 "除数不能为零"。这将导致程序的执行立即停止,并抛出一个运行时异常。

  2. recoverrecover 用于捕获并处理 panic 引发的异常。它只能在 defer 函数中被调用,并且可以用于恢复程序的正常执行流程。当 recover 被调用时,它会返回导致 panic 的错误信息,如果没有发生 panicrecover 返回 nil

    示例:

    func 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 关键字可以用于遍历数组、切片、字符串、字典等数据结构,提供了一种简洁的方式来迭代元素。例如:

numbers := []int{1, 2, 3, 4, 5}
// i 为索引
for i, num := range numbers {
    fmt.Println(i, num)
}

struct 字面量初始化

在初始化结构体时,可以省略字段名称,只提供对应的值列表。编译器会根据字段的顺序进行匹配赋值。例如:

type Person struct {
  Name string
  Age  int
}
person := Person{"John", 30} // 可以省略 Person{Name: "John", Age: 30}
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Go协程揭秘:轻量、并发与性能的.. 下一篇github.com/json-iterator/go 详..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目