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
语句块进行了数据库资源的释放。