在java语言中,我们遇到错误的话会涉及到使用try-catch-finally这样子的操作,例如我们在使用redis的时候,我们使用redis的连接池,那么在return或者报错的处理的时候,我们需要涉及到把redis的connection还回到连接池里面,所以我们经常会涉及到finally函数里面关闭掉资源,下面列举下java代码使用redis的案例:
package com.test; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.beans.factory.annotation.Autowired; import lombok.extern.slf4j.Slf4j; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; @Slf4j public class GoodController { private JedisPool pool; @PostConstruct public void init() { // 连接池配置 JedisPoolConfig poolConfig = new JedisPoolConfig(); // 设置最多连接数为200个 poolConfig.setMaxTotal(200); // 创建连接池 pool = new JedisPool(poolConfig, "127.0.0.1", 6379); } @PreDestroy public void destory() { if (null != pool) { pool.close(); } } public Integer getGoodsNum() { Jedis jedis = null; try { // 获取连接对象jedis jedis = pool.getResource(); return Integer.valueOf(jedis.get("goods_num")); } catch (Exception e) { log.error(e.getMessage(), e); } finally { if (null != jedis) { jedis.close(); } } return 0; } }
从这里我们可以看到在finally里面我们把jedis客户端还回到了redis 连接池里面,这时候不管是发生异常还是在return之前,都会执行这里的jedis.close()代码。
在go语言中,其实我们同样都会遇到这样的问题,如果报错或者如果需要返回,那么我们一定要去释放这里的资源,如果不释放的话,资源会一直被进程给占用着,导致其他线程获取不到这些资源。
那么在go语言中怎么处理这种fanally呢?其实就是这个defer函数,在go语言中,我们在做一些类似错误异常处理或者最后销毁资源的时候,把对应的函数方法使用defer修饰,这样子go语言会自动在最后执行这个对应的函数方法,下面我们列举下使用go语言来处理redis上面这个案例的例子,示例代码如下:
// demo1 project main.go package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func getGoodsNum() { // 通过go向redis写入数据和读取数据 // 1.连接到redis "3c0bef8420ca0961a74ff1fbe8c66ef4" conn, err := redis.Dial("tcp", "192.168.31.30:6379", redis.DialPassword("3c0bef8420ca0961a74ff1fbe8c66ef4")) defer conn.Close() //关闭连接 if err != nil { fmt.Println("redis connect failed. err = ", err) return } // 2.通过go向redis写入数据 _, err = conn.Do("Set", "goods_num", 1) if err != nil { fmt.Println("Set err = ", err) return } // 3.从redis中读取数据 // 由于返回的r是一个interface{},故要转成字符串 r, err := redis.Int(conn.Do("Get", "goods_num")) if err != nil { fmt.Println("Get err = ", err) return } fmt.Println("获取goods_num的结果是:", r) // } func main() { getGoodsNum() }
可以看到这里我们在处理redis连接关闭的时候,我们使用defer函数,同时这个defer函数的话和java使用finally不一样,在java中finally是写在方法最后的,在go语言中,一般我们创建完资源之后,立马会直接defer释放资源,这样子做主要是为了避免后面忘记掉释放这里的资源。
还没有评论,来说两句吧...