Golang 资源管理、错误处理、IO操作

ゞ 浴缸里的玫瑰 2022-10-11 03:37 80阅读 0赞

目录

      • 资源管理 defer
      • 错误处理
      • panic和recover
      • 待整理
        • io
        • http
        • web

资源管理 defer

defer

  • 在defer语句位置处就计算用到的参数值,只是放在在函数返回值之前执行
  • 一个函数中的多个defer是栈的结构,先进后出,位置靠前的defer后执行

    func f1() {

    1. defer fmt.Println(1)
    2. defer fmt.Println(2)
    3. fmt.Println(3)
    4. //即使defer后面有return,panic,也会执行defer
    5. panic("发生错误")
    6. fmt.Println(4)

    }

    func f2() {

    1. i := 1
    2. //这个defer语句要输出的值在此处就已确认 1,并不是在函数结束、执行defer时才确认
    3. defer fmt.Println(i)
    4. i = 10

    }

defer常用于确保在函数结束时执行语句,常见的使用场景如下

  • Open/Close 资源、连接的关闭
  • Lock/Unlock 锁的释放
  • PrintHeader/PrintFooter

    func write(filePath string, str string) {

    1. //创建文件,可以使用相对路径、绝对路径,但文件名之前的路径要是已存在的,不然会报错
    2. file, err := os.Create(filePath)
    3. if err != nil {
    4. panic(err)
    5. }
    6. //函数结束时关闭文件
    7. defer file.Close()
    8. //使用缓冲写入文件
    9. writer := bufio.NewWriter(file)
    10. //函数结束时把缓冲区的内容刷出到文件
    11. defer writer.Flush()
    12. for i := 0; i < 10; i++ {
    13. writer.WriteString(str)
    14. }

    }

    func main() {

    1. write("test/1.txt", "xxx\n")

    }

错误处理

panic和recover

panic要慎用,不能随便用

  1. //格式化输出,%c是字符
  2. //fmt.Printf("%d%s%d=%d\n", a, operator, b, a*b)
  3. //panic
  4. //panic(fmt.Sprintf("不支持的运算符:%s", operator))
  5. //支持字符串
  6. //panic("不支持的运算符:" + operator)
  7. //整型int转字符串
  8. // panic("不合法的分数值:" + strconv.Itoa(score))
  9. panic("发生错误")
  10. //panic(errors.New("xxx错误"))

待整理

io

  1. func main() {
  2. //文件读写
  3. const filePath = "C:/Users/chy/Desktop/1.txt"
  4. if content, err := ioutil.ReadFile(filePath);err!=nil {
  5. fmt.Println(err)
  6. }else {
  7. //返回的content是byte[],转换为string输出
  8. fmt.Printf("%s\n", content)
  9. }
  10. }

http

  1. func Get(url string) string {
  2. resp, err := http.Get(url)
  3. if err != nil {
  4. panic(err)
  5. }
  6. result, err := httputil.DumpResponse(
  7. resp, true)
  8. resp.Body.Close()
  9. if err != nil {
  10. panic(err)
  11. }
  12. return string(result)
  13. }

web

  1. func main() {
  2. const dir = "/list/"
  3. http.HandleFunc(dir,
  4. func(writer http.ResponseWriter, request *http.Request) {
  5. path := request.URL.Path[len(dir):]
  6. file, err := os.Open("E:\\go_path\\src\\go_demo\\http-server\\"+path)
  7. if err != nil {
  8. panic(err.Error())
  9. }
  10. defer file.Close()
  11. all, err := ioutil.ReadAll(file)
  12. if err != nil {
  13. panic(err)
  14. }
  15. writer.Write(all)
  16. })
  17. err := http.ListenAndServe(":8888", nil)
  18. if err != nil {
  19. panic(err)
  20. }
  21. }

发表评论

表情:
评论列表 (有 0 条评论,80人围观)

还没有评论,来说两句吧...

相关阅读

    相关 golang处理运行时错误

    Go语言的错误处理思想及设计包含以下特征: //一个可能造成错误的函数,需要返回值中返回一个错误接口(error),如果调用是成功的,错误接口将返回nil,否则返回错误

    相关 Golang代码搜集-资源管理

    这段代码来自《Go语言实战》第7.2节,演示如何编写一个资源池,可用于数据库连接等。原代码资源管理的效果并不明显,笔者对测试用代码进行了修改,使效果更明显。下面直接上代码。