Wire实现Golang依赖注入一、什么是依赖注入简单来说,就是在项目开发中,我们经常遇到一直情况,实例A的创建会依赖于实例B的创建,并且在实例A的生命周期内,持有对实例B的访问权限。
二、为什么要使用依赖注入如果不适用依赖注入的话会有以下风险:
全局变量⼗分不安全,存在覆写的可能。
资源散落在各处,可能重复创建,浪费内存,后续维护能⼒极差。
提⾼循环依赖的⻛险。
全局变量的引⼊提⾼单元测试的成本
在使用依赖注入后,可以方便我们的代码进行维护。
三、Golang依赖注入目前来说我的解决方案是通过Google的Wire去实现Golang依赖注入
Wire对比与其他在运行阶段依靠反射实现依赖注入的方式来说,优势在于能在编译期实现依赖注入,如果依赖注⼊有问题,那么在代码⽣成时就会抛出异常,并不会拖到运⾏时暴露,更便于我们进行debug。
3.1 安装Wire1go install github.com/google/wire/cmd/wire@latest
3.2 代码实现123456789101112131415161718func initWebServer() *gin.Engi ...
十大排序算法冒泡排序 (Bubble Sort)
冒泡排序是一种简单的排序算法
它重复地遍历要排序的数列,一次比较两个元素,如果顺序错误就把它们交换过来
遍历的最终结果是会把最大的数冒泡地沉到最底下,最小的数会像鱼泡一样被冒泡地推到最上面来
算法步骤
比较相邻的元素。如果第一个比第二个大,就交换它们两个
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
针对所有的元素重复以上的步骤,除了最后一个
重复步骤 1~3,直到排序完成
图解算法
实现代码1234567891011121314151617181920212223242526272829/** * 冒泡排序 * * @param nums 待排序数组 */public static void BubbleSort(int[] nums) { // 初始化两个指针,slow和fast int slow = 0, fast = 1; // 外层循环,遍历整个数组 for (int i = 0; i < nums.length; i++) & ...
Kubernetes安装Docker安装移除以前docker相关包12345678sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
配置yum源1234sudo yum install -y yum-utilssudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker1yum install -y docker-ce-20.10.7 doc ...
后端开发
未读HashMap的底层实现JDK1.8 之前JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashcode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突
所谓扰动函数指的就是 HashMap 的 hash 方法
使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞
JDK 1.7 HashMap 的 hash 方法源码:
12345678static int hash(int h) { // This function ensures that hashCodes that differ only by // constant multiples at each bit posit ...
HashMap和常用集合类的区别HashMap 和 HashTable 的区别
线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的,因为 HashTable 内部的方法基本都经过synchronized 修饰。(如果要保证线程安全的话推荐使用 ConcurrentHashMap )
效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点,HashTable 基本被淘汰,尽量不要在代码中使用它
对 Null key 和 Null value 的支持: HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个,HashTable 不允许有 null 键和 null 值,否则会抛出NullPointerException
初始容量大小和每次扩充容量大小的不同:
创建时如果不指定容量初始值,HashTable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n + 1,HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍
创建时如果给定了 ...
KMP算法KMP 算法是一个快速查找匹配串的算法,它的作用其实就是本题问题:如何快速在「原字符串」中找到「匹配字符串」在朴素解法中,不考虑剪枝的话复杂度是 O(m∗n) 的,而 KMP 算法的复杂度为 O(m+n)KMP 之所以能够在O(m+n) 复杂度内完成查找,是因为其能在「非完全匹配」的过程中提取到有效信息进行复用,以减少「重复匹配」的消耗
匹配过程前缀: 对于字符串 abc…efg,我们称 abc 属于 ab…efg 的某个前缀后缀: 对于字符串 abc…efg,我们称 efg 属于 ab…efg 的某个后缀
假设原串为 abeababeabf,匹配串为 abeabf
朴素匹配不使用 KMP,采用最朴素的暴力匹配方法首先在「原串」和「匹配串」分别各自有一个指针指向当前匹配的位置首次匹配的「发起点」是第一个字符 a 显然,后面的 abeab 都是匹配的,两个指针会同时往右移动(黑标)在都能匹配上 abeab 的部分,「朴素匹配」和「KMP」并无不同
直到出现第一个不同的位置(红标):接下来,正是「朴素匹配」和「KMP」出现不同的地方:先看下「朴素匹配」逻辑:将原串的指针移动至本 ...
大数据常用集群脚本一、集群分发同步脚本1.1 在/bin目录下创建xsync文件1cd /bin && vim xsync
1.2 xsync集群分发同步Shell脚本12345678910111213141516171819202122232425262728#!/bin/bash#1. 判断参数个数if [ $# -lt 1 ]then echo Not Enough Arguement! exit;fi#2. 遍历集群所有机器for host in master slave1 slave2do echo ==================== $host ==================== #3. 遍历所有目录,挨个发送 for file in $@ do #4 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 fname=$(basename $file ...
字节跳动数据开发面试复盘Hive 数据仓库分层可以看我这篇文章Hive 数据仓库分层
爬楼梯问题经典的递归问题,也可以优化一下题目来源: LeetCode 70. 爬楼梯
递归解法1234567891011class Solution { public int climbStairs(int n) { if(n == 1){ return 1; }else if(n == 2){ return 2; }else{ return climbStairs(n - 1) + climbStairs(n - 2); } }}
递归优化算法用常规的递归去解决这个问题,但会带来一个问题,即超出时间限制因此,可以用 Map 去做一个缓存,类似于减枝的效果,可以显著降低递归带来的重复计算问题这里呢,有点像是动态规划,用一个缓存表去减少递归的计算量,由于我也不太会动态规划, ...
数仓分层数据仓库理论上一般分为三层
ODS 数据运营层
DW 数据仓库层
ADS 数据服务层
ODS 数据运营层OperationDataStore数据准备区,也称为贴源层。数据仓库源头系统的数据表通常会原封不动的存储一份,称为 ODS 层,是后续数据仓库加工数据的来源。ODS 层数据的来源方式:
业务库: 离线方面经常会使用 Sqoop 来抽取,例如每天定时抽取一次。实时方面可以考虑用 Canal 监听 MySQL 的 binlog,实时接入即可。
埋点日志: 日志一般以文件的形式保存,可以选择用 Flume 定时同步,可以用 SparkStreaming 或者 Flink 来实时接入
消息队列: 即来自 ActiveMQ、Kafka 的数据等。
DW 数据仓库层DW 数据仓库层,由下到上可以分为 DWD(数据明细层),DWM(数据中间层),DWS(数据服务层)。从 ODS 层中获得的数据将按照主题建立各种数据模型。这一层和维度建模会有比较深的联系。
DWD 细节数据层DWD: Data Warehouse Details 细节数据层,是业务层与数据仓库的隔离层。主要对 OD ...
JUC面试题volatile关键字的作用?一个共享变量(类的成员变量、类的静态成员变量)在被 volatile关键字 修饰之后,那么就具备了两层语义:
保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的
禁止进行指令重排序
volatile和synchronized的区别
volatile 本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住
volatile 仅能使用在变量级别synchronized则可以使用在变量、方法、和类级别的
volatile仅能实现变量的修改可见性,并不能保证原子性synchronized则可以保证变量的修改可见性和原子性
volatile不会造成线程的阻塞synchronized可能会造成线程的阻塞
volatile标记的变量不会被编译器优化synchronized标记的变量可以被编译器优化