Go语言 和 Java语言对比理解系列二:延迟执行&资源释放


Go语言中 defer关键字可以通俗的理解为 延迟执行(函数执行的最后再去执行 defer标识的操作)。主要用于资源的回收、释放等。
Java语言中的 try- finally语句块是在执行完 try中的语句以后再执行 finally中的语句也可以达到延迟执行的效果,同样可以用来释放/回收资源等。

延迟执行

defer

package main

import (
	"database/sql"
	"fmt"
	"time"
)

func closeRes(db *sql.DB) {
   fmt.Println("关闭数据库")
   db.Close()
}

func main() {
   fmt.Println("Hello!")

   defer fmt.Println("Hello, Again!")

   for i := 0; i < 3; i++ {
      time.Sleep(1 * time.Second)
      fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
   }
}

输出结果如下:
在这里插入图片描述
可以看到输出Hello, Again!是在后面的打印时间语句之后才执行的。

finally

package com.example;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello!");

        try {
            for(int i = 0; i < 3; i++) {
                Thread.sleep(1000L);
                System.out.println(LocalDateTime.now()
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("Hello, Again!");
        }
    }
}

执行结果如下:
在这里插入图片描述
可以看到输出Hello, Again!是在后面的打印时间语句之后才执行的。

资源释放

defer

package main

import (
	"database/sql"
	"fmt"
   _ "github.com/go-sql-driver/mysql"
)

func closeRes(db *sql.DB) {
   fmt.Println("关闭数据库")
   db.Close()
}

func main() {
   db, err := sql.Open("mysql", "root:123456@tcp(localhost:3306)/test?charset=utf8")
   
   // 延迟关闭数据库
   defer closeRes(db)

	if err != nil {
		fmt.Println(err)
	}
   err = db.Ping()
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println("数据库连接成功")
}

执行结果如下:
在这里插入图片描述
可以看到在主函数退出时通过defer关键字进行了数据库资源的释放。

finally

package com.example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stm = null;
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            Properties p = new Properties();
            p.setProperty("user","root");  //设置Properties对象属性
            p.setProperty("password","123456");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false",p);
            stm = conn.createStatement();
            boolean b = stm.execute("select 1 from dual");
            if (b) {
                System.out.println("数据库连接成功");
            }
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (stm != null) {
                    stm.close();
                }
                if (conn != null) {
                    conn.close();
                }
                System.out.println("关闭数据库");
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

执行结果如下:
在这里插入图片描述
可以看到在主函数退出时通过finally语句块进行了数据库资源的释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值