<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[baixieyun4655的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/baixieyun4655</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; baixieyun4655]]></copyright><item><title><![CDATA[Go组件学习——手写连接池并没有那么简单]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318609</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318609</guid><author>baixieyun4655</author><pubDate>Sun, 08 Sep 2019 11:44:00 +0800</pubDate><description><![CDATA[1、背景
前段时间在看gorm，发现gorm是复用database/sql的连接池。
于是翻了下database/sql的数据库连接池的代码实现，看完代码，好像也不是很复杂，但是总觉得理解不够深刻，于是萌生了自己想写个连接池的想法。（最后也验证了，看源码的理解确实不够深刻，一看就会，一做就跪）
2、连接池的实现原理
什么是连接池

顾名思义是一个池子
池子里面存放有限数量即...]]></description><category></category></item><item><title><![CDATA[终于跑通分布式事务框架tcc-transaction的示例项目]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318608</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318608</guid><author>baixieyun4655</author><pubDate>Sat, 31 Aug 2019 19:09:00 +0800</pubDate><description><![CDATA[1、背景
前段时间在看项目代码的时候，发现有些接口的流程比较长，在各个服务里面都有通过数据库事务保证数据的一致性，但是在上游的controller层并没有对一致性做保证。
网上查了下，还没找到基于Go开源的比较成熟的分布式事务框架。
于是，准备看看之前隔壁部门大佬写的tcc-transaction，这是一个基于tcc思想实现的分布式事务框架。
tcc分别代码Try，Confirm...]]></description><category></category></item><item><title><![CDATA[Go语言学习——如何实现一个过滤器]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318605</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318605</guid><author>baixieyun4655</author><pubDate>Fri, 30 Aug 2019 00:58:00 +0800</pubDate><description><![CDATA[1、过滤器使用场景
　　做业务的时候我们经常要使用过滤器或者拦截器（听这口音就是从Java过来的）。常见的场景如一个HTTP请求，需要经过鉴权过滤器、白名单校验过滤、参数验证过滤器等重重关卡最终拿到数据。
　　Java使用过滤器很简单。XML时代，只要添加一个过滤器配置再新建一个实现了Filter接口的xxxFilter实现类；Java Configuration时代，只要在xxxC...]]></description><category></category></item><item><title><![CDATA[Go组件学习——database/sql数据库连接池你用对了吗]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318604</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318604</guid><author>baixieyun4655</author><pubDate>Sun, 25 Aug 2019 17:28:00 +0800</pubDate><description><![CDATA[1、案例
case1： maxOpenConns &gt; 1

func fewConns() {
	db, _ := db.Open("mysql", "root:rootroot@/dqm?charset=utf8&amp;parseTime=True&amp;loc=Local")

	db.SetMaxOpenConns(10)
	rows, err := db....]]></description><category></category></item><item><title><![CDATA[数据库炸了——是谁动了我的wait_timeout]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318603</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318603</guid><author>baixieyun4655</author><pubDate>Sun, 18 Aug 2019 18:32:00 +0800</pubDate><description><![CDATA[1、起因
　　隐约听到坐在我对面的测试说测试环境的接口有问题
　　他们一番商讨后，朝我这边反馈说，现在测试环境的接口报504
　　我条件反射的回了句那是接口超时，再多试几次（测试环境的性能比较差，尤其是数据库，经常504
　　测试同学并不信服的点点头

　　再一会，有同事反馈自测自己的功能发现操作数据库失败，我去瞅了一眼
　　invalid connection,嗯，这个...]]></description><category></category></item><item><title><![CDATA[Go组件学习——gorm四步带你搞定DB增删改查]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318602</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318602</guid><author>baixieyun4655</author><pubDate>Sun, 04 Aug 2019 16:49:00 +0800</pubDate><description><![CDATA[1、简介
ORM
　　Object-Relationl Mapping， 它的作用是映射数据库和对象之间的关系，方便我们在实现数据库操作的时候不用去写复杂的sql语句，把对数据库的操作上升到对于对象的操作。
gorm
　　gorm就是基于Go语言实现的ORM库。
　　类似于Java生态里大家听到过的Mybatis、Hibernate、SpringData等。
Github
...]]></description><category></category></item><item><title><![CDATA[Go组件学习——cron定时器]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318600</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318600</guid><author>baixieyun4655</author><pubDate>Sun, 28 Jul 2019 18:54:00 +0800</pubDate><description><![CDATA[1 前言
　　转到Go已经将近三个月，写业务代码又找到了属于Go的条件反射了。
　　后置声明和多参数返回这些Go风格代码写起来也不会那么蹩脚，甚至还有点小适应~
　　反而，前几天在写Java的时候，发现Java怎么启动这么慢，Java怎么能够容忍这些用不到的代码还理直气壮的躺在那……等等，这些话在哪听过类似的？？？
　　“Go为什么要后置声明，多别扭啊”
　　“Go里面为啥要定...]]></description><category></category></item><item><title><![CDATA[Go语言学习——channel的死锁其实没那么复杂]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318599</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318599</guid><author>baixieyun4655</author><pubDate>Sun, 07 Jul 2019 12:24:00 +0800</pubDate><description><![CDATA[1 为什么会有信道
　　协程（goroutine）算是Go的一大新特性，也正是这个大杀器让Go为很多路人驻足欣赏，让信徒们为之欢呼津津乐道。
　　协程的使用也很简单，在Go中使用关键字“go“后面跟上要执行的函数即表示新启动一个协程中执行功能代码。

func main() {
    go test()
    fmt.Println("it is the main gor...]]></description><category></category></item><item><title><![CDATA[Go语言学习——彻底弄懂return和defer的微妙关系]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318598</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318598</guid><author>baixieyun4655</author><pubDate>Sat, 29 Jun 2019 18:39:00 +0800</pubDate><description><![CDATA[疑问
　　前面在函数篇里介绍了Go语言的函数是支持多返回值的。
　　只要在函数体内，对返回值赋值，最后加上return就可以返回所有的返回值。
　　最近在写代码的时候经常遇到在return后，还要在defer里面做一些收尾工作，比如事务的提交或回滚。所以想弄清楚这个return和defer到底是什么关系，它们谁先谁后，对于最后返回值又有什么影响呢？

动手验证
　　了解下来...]]></description><category></category></item><item><title><![CDATA[Go语言入门——interface]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318597</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318597</guid><author>baixieyun4655</author><pubDate>Sun, 23 Jun 2019 18:18:00 +0800</pubDate><description><![CDATA[1、Go如何定义interface
　　Go通过type声明一个接口，形如

type geometry interface {
    area() float64
    perim() float64
}


　　和声明一个结构体一样，接口也是通过type声明。
　　type后面是接口名称，紧挨着是关键字interface。
　　接口里面定义的area()和...]]></description><category></category></item><item><title><![CDATA[Go语言入门——函数]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318596</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318596</guid><author>baixieyun4655</author><pubDate>Sat, 15 Jun 2019 23:54:00 +0800</pubDate><description><![CDATA[写了快一个月的Go，已经没有什么陌生感了。

一行代码写完，不会在行尾本能的敲上“；”，直接Enter键换行；
定义变量把变量名放在前面，类型放在后面；
使用struct去定义自己想要的数据模型就好比定义一个Java中的model一样……

这些不用可以经过大脑加工思考，就想自己还在写Java一样。

还记得当时在看《Go实战》的时候看到变量类型后置的声明方式，我还...]]></description><category></category></item><item><title><![CDATA[Go语言入门——数组、切片和映射（下）]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318595</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318595</guid><author>baixieyun4655</author><pubDate>Sun, 26 May 2019 12:49:00 +0800</pubDate><description><![CDATA[上篇主要介绍了Go语言里面常见的复合数据类型的声明和初始化。
这篇主要针对数组、切片和映射这些复合数据类型从其他几个方面介绍比较下。
1、遍历
　　不管是数组、切片还是映射结构，都是一种集合类型，要从这些集合取出元素就要查找或者遍历。
　　对于从其他语言转到Go语言，在遍历这边还是有稍稍不同的。
数组遍历
形式1

package main

import "fmt"...]]></description><category></category></item><item><title><![CDATA[Go语言入门——数组、切片和映射]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318593</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318593</guid><author>baixieyun4655</author><pubDate>Sun, 19 May 2019 10:30:00 +0800</pubDate><description><![CDATA[按照以往开一些专题的风格，第一篇一般都是“从HelloWorld开始”
但是对于Go，思来想去，感觉真的从“HelloWorld”说起，压根撑不住一篇的篇幅，因为Go的HelloWorld太简单了。

1、简介

Go是什么？

Go（又称Golang）是Google开发的一种静态强类型、编译型、并发型，并具有垃圾回收功能的编程语言。——摘自百度百科


Gi...]]></description><category></category></item><item><title><![CDATA[2018的穿肠毒药和2019的心灵鸡汤]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318591</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318591</guid><author>baixieyun4655</author><pubDate>Sun, 17 Feb 2019 10:34:00 +0800</pubDate><description><![CDATA[　　今年这个春节，《流浪地球》大火，路人皆知，准确的说，连银河系都知道地球要跑路了，还顺带无情的抛弃了月亮。 所以，太阳不高兴了，整个春节也没给我们什么好脸，甚至连脸都没露~   

　　人，有时候很感性。风和日丽的时候心情也跟着明朗起来，乌云密布、阴雨连连的时候，自然也开心不起来。
  
　　今天和几个同行小聚了下，闲聊之余也是感慨颇多。无论是当前不太乐观的大环境，还是自身成...]]></description><category></category></item><item><title><![CDATA[《数据结构与算法之美》——冒泡排序、插入排序、选择排序]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318592</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318592</guid><author>baixieyun4655</author><pubDate>Sun, 13 Jan 2019 21:35:00 +0800</pubDate><description><![CDATA[排序，是每一本数据结构的书都绕不开的重要部分。
排序的算法也是琳琅满目、五花八门。
每一个算法的背后都是智慧的结晶，思想精华的沉淀。
个人觉得排序算法没有绝对的孰优孰劣，用对了场景，就是最有的排序算法。
当然，撇开这些业务场景，排序算法本身有一些自己的衡量指标，比如我们经常提到的复杂度分析。
我们如何分析一个算法？
排序算法的执行效率
1、最好、最坏和平均情况的时间复杂度
2、时间复杂度...]]></description><category></category></item><item><title><![CDATA[《数据结构与算法之美》- 栈]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318589</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318589</guid><author>baixieyun4655</author><pubDate>Sat, 01 Dec 2018 22:51:00 +0800</pubDate><description><![CDATA[栈，在这里说的是一种数据结构。
你还可能知道的栈
提到“栈”，做Java的同学还会想起Java内存模型中的“栈”，与之紧密关联的还有一个名词——堆，但是这里，此栈非彼栈。
引用《深入理解Java虚拟机》中有关栈的介绍

经常有人把Java内存区分为堆内存（Heap）和栈内存（Stack），这种分法比较粗糙，Java内存区域的划分实际上远比这复杂。这种划分方式的流行只能说明大多数程序员最关...]]></description><category></category></item><item><title><![CDATA[Spring Boot系列——AOP配自定义注解的最佳实践]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318590</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318590</guid><author>baixieyun4655</author><pubDate>Sun, 11 Nov 2018 16:59:00 +0800</pubDate><description><![CDATA[AOP(Aspect Oriented Programming)，即面向切面编程，是Spring框架的大杀器之一。
首先，我声明下，我不是来系统介绍什么是AOP，更不是照本宣科讲解什么是连接点、切面、通知和切入点这些让人头皮发麻的概念。
今天就来说说AOP的一些应用场景以及如何通过和其他特性的结合提升自己的灵活性。
AOP应用举例
AOP的一大好处就是解耦。通过切面，我们可以将那些反复出...]]></description><category></category></item><item><title><![CDATA[Spring Boot系列——死信队列]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318406</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318406</guid><author>baixieyun4655</author><pubDate>Sun, 28 Oct 2018 19:53:00 +0800</pubDate><description><![CDATA[在说死信队列之前，我们先介绍下为什么需要用死信队列。
如果想直接了解死信对接，直接跳入下文的"死信队列"部分即可。
ack机制和requeue-rejected属性
我们还是基于上篇《Spring Boot系列——7步集成RabbitMQ》的demo代码来说。
在项目springboot-demo我们看到application.yaml文件部分配置内容如下

...

listener:...]]></description><category></category></item><item><title><![CDATA[Spring Boot系列——7步集成RabbitMQ]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318407</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318407</guid><author>baixieyun4655</author><pubDate>Mon, 22 Oct 2018 23:09:00 +0800</pubDate><description><![CDATA[RabbitMQ是一种我们经常使用的消息中间件，通过RabbitMQ可以帮助我们实现异步、削峰的目的。
今天这篇，我们来看看Spring Boot是如何集成RabbitMQ，发送消息和消费消息的。同时我们介绍下死信队列。
集成RabbitMQ
集成RabbitMQ只需要如下几步即可
1、添加maven依赖

&lt;!--rabbitmq--&gt;

&lt;dependency&gt...]]></description><category></category></item><item><title><![CDATA[让我头疼一下午的Excel合并单元格]]></title><link>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318405</link><guid>https://blog.youkuaiyun.com/baixieyun4655/article/details/101318405</guid><author>baixieyun4655</author><pubDate>Mon, 15 Oct 2018 22:33:00 +0800</pubDate><description><![CDATA[Excel导出常见问题
excel导出其实不算什么难事
在网上copy下模板代码，填充自己的业务数据，提供一个http接口基本就可以得到你要导出的数据了。
但是，凡事都有例外，截止今天，excel导出我遇到的主要是两大类问题
1、大数据量的excel数据，比如几十万条甚至更多的数据导出
2、因为excel中内容的问题，导致导出后的excel不能直接打开，报错“由于一些内容不可取，Exce...]]></description><category></category></item></channel></rss>