在Go中,如果interface{}作为函数参数的话,是可以传任意参数的,然后通过类型断言来转换。 举个例子: packagemain import"fmt" funcfoo(vinterface{}){ ifv1,ok1:=v.(string);ok1{ fmt.Println(v1) }elseifv2,ok2:=v.(int);ok2{ fmt.Println(v2) } } funcmain(){ foo(233) foo("666") } 不管是传int还是string,最终都能输出正确结果。 那么,既然是这样的话,我就有一个疑问了,拿出我举一反三的能力。是否可以将[]T转换...

  KnIo2xqMjcu8   2023年11月02日   88   0   0 Go

原文链接:为什么Go语言struct要使用tags 在Go语言中,struct是一种常见的数据类型,它可以用来表示复杂的数据结构。在struct中,我们可以定义多个字段,每个字段可以有不同的类型和名称。 除了这些基本信息之外,Go还提供了structtags,它可以用来指定struct中每个字段的元信息。 在本文中,我们将探讨为什么Go语言中需要使用structtags,以及structtags的使用场景和优势。 structtags的使用 structtags使用还是很广泛的,特别是在json序列化,或者是数据库ORM映射方面。 在定义上,它以key:value的形式出现,跟在struct...

  KnIo2xqMjcu8   2023年11月02日   208   0   0 Go

原文链接:Go语言new和make关键字的区别 本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的。那就是new和make这两个内置函数的区别。 其实这个问题本身并不复杂,简单来说就是,new只分配内存,而make只能用于slice、map和chan的初始化,下面我们就来详细介绍一下。 new new是一个内置函数,它会分配一段内存,并返回指向该内存的指针。 其函数签名如下: 源码 //Thenewbuilt-infunctionallocatesmemory.Thefirstargumentisatype, //notavalue,andthevaluer...

  KnIo2xqMjcu8   2023年11月02日   63   0   0 Go

原文链接:Go语言数组和切片的区别 在Go语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 另外,这个问题在面试中也经常会被问到,属于入门级题目,看过文章之后,相信你会有一个很好的答案。 数组 数组是同一种数据类型元素的集合,数组在定义时需要指定长度和元素类型。 例如:[4]int表示一个包含四个整数的数组,数组的大小是固定的。并且长度是其类型的一部分([4]int和[5]int是不同的、不兼容的类型)。 数组元素可以通过索引来访问,比如表达式s[n]表示访问第n个元素,索引从零开始。 声明以及初始化 funcmain(){ varnums[3...

  KnIo2xqMjcu8   2023年11月02日   38   0   0 Go

原文链接:Go语言切片是如何扩容的? 在Go语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: typeslicestruct{ arrayunsafe.Pointer lenint capint } 指针:指向slice可以访问到的第一个元素。 长度:slice中元素个数。 容量:slice起始元素到底层数组最后一个元素间的元素个数。 比如使用make([]byte,5)创建一个切片,它看起来是这样的:...

  KnIo2xqMjcu8   2023年11月02日   55   0   0 Go

原文链接:为什么Gofor-range的value值地址每次都一样? 循环语句是一种常用的控制结构,在Go语言中,除了for关键字以外,还有一个range关键字,可以使用for-range循环迭代数组、切片、字符串、map和channel这些数据类型。 但是在使用for-range循环迭代数组和切片的时候,是很容易出错的,甚至很多老司机一不小心都会在这里翻车。 具体是怎么翻的呢?我们接着看。 现象 先来看两段很有意思的代码: 无限循环 如果我们在遍历数组的同时向数组中添加元素,能否得到一个永远都不会停止的循环呢? 比如下面这段代码: funcmain(){ arr:=[]int{1,2,3} ...

  KnIo2xqMjcu8   2023年11月02日   52   0   0 Go

原文链接:Go语言map是并发安全的吗? Go语言中的map是一个非常常用的数据结构,它允许我们快速地存储和检索键值对。然而,在并发场景下使用map时,还是有一些问题需要注意的。 本文将探讨Go语言中的map是否是并发安全的,并提供三种方案来解决并发问题。 先来回答一下题目的问题,答案就是并发不安全。 看一段代码示例,当两个goroutine同时对同一个map进行写操作时,会发生什么? packagemain import"sync" funcmain(){ m:=make(map[string]int) m["foo"]=1 varwgsync.WaitGroup wg.Add(2) ...

  KnIo2xqMjcu8   2023年11月02日   52   0   0 Go

原文链接:为什么说Go语言字符串是不可变的? 最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说Go语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。 首先来看看它的底层结构: typestringStructstruct{ strunsafe.Pointer lenint } 和切片的结构很像,只不过少了一个表示容量的cap字段。 str:指向一个[]byte类型的指针 len:字符串的长度 所以,当我们定义一个字符串: s:="HelloWorld" 那么它在内存中存储是这样的: 当我们在程序中对...

  KnIo2xqMjcu8   2023年11月02日   66   0   0 Go

原文链接:Go语言context都能做什么? 很多Go项目的源码,在读的过程中会发现一个很常见的参数ctx,而且基本都是作为函数的第一个参数。 为什么要这么写呢?这个参数到底有什么用呢?带着这样的疑问,我研究了这个参数背后的故事。 开局一张图: 核心是Context接口: //AContextcarriesadeadline,cancelationsignal,andrequest-scopedvalues //acrossAPIboundaries.Itsmethodsaresafeforsimultaneoususebymultiple //goroutines. typeContext...

  KnIo2xqMjcu8   2023年11月02日   54   0   0 Go

原文链接:Go语言select都能做什么? 在Go语言中,select是一个关键字,用于监听和channel有关的IO操作。 通过select语句,我们可以同时监听多个channel,并在其中任意一个channel就绪时进行相应的处理。 本文将总结一下select语句的常见用法,以及在使用过程中的注意事项。 基本语法 select语句的基本语法如下: select{ case<-channel1: //通道channel1就绪时的处理逻辑 casedata:=<-channel2: //通道channel2就绪时的处理逻辑 default: //当没有任何通道就绪时的默认处理逻辑 ...

  KnIo2xqMjcu8   2023年11月02日   47   0   0 Go

原文链接:使用Go语言实现二叉搜索树 二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影。 它有很多变种,比如红黑树,常被用作std::map和std::set的底层实现;B树和B+树,广泛应用于数据库系统中。 本文要介绍的二叉搜索树用的也很多,比如在开源项目go-zero中,就被用来做路由管理。 这篇文章也算是一篇前导文章,介绍一些必备知识,下一篇再来介绍具体在go-zero中的应用。 二叉搜索树的特点 最重要的就是它的有序性,在二叉搜索树中,每个节点的值都大于其左子树中的所有节点的值,并且小于其右子树中的所有节点的值。 这意味着通过二叉搜索树可以快速实现对数据的查找...

  KnIo2xqMjcu8   2023年11月02日   116   0   0 Go

原文链接:go-zero是如何做路由管理的? go-zero是一个微服务框架,包含了web和rpc两大部分。 而对于web框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下go-zero的路由管理是怎么做的,具体采用了哪种技术方案。 路由管理方案 路由管理方案有很多种,具体应该如何选择,应该根据使用场景,以及实现的难易程度做综合分析,下面介绍常见的三种方案。 注意这里只是做一个简单的概括性对比,更加详细的内容可以看这篇文章:HTTPRouter算法演进。 标准库方案 最简单的方案就是直接使用map[string]func()作为路由的数据结构,键为具体的路由,值为具体的处理方法。 //...

  KnIo2xqMjcu8   2023年11月02日   49   0   0 Go

原文链接:如何实现计数器限流? 上一篇文章go-zero是如何做路由管理的?介绍了路由管理,这篇文章来说说限流,主要介绍计数器限流算法,具体的代码实现,我们还是来分析微服务框架go-zero的源码。 在微服务架构中,一个服务可能需要频繁地与其他服务交互,而过多的请求可能导致性能下降或系统崩溃。为了确保系统的稳定性和高可用性,限流算法应运而生。 限流算法允许在给定时间段内,对服务的请求流量进行控制和调整,以防止资源耗尽和服务过载。 计数器限流算法主要有两种实现方式,分别是: 固定窗口计数器 滑动窗口计数器 下面分别来介绍。 固定窗口计数器 算法概念如下: 将时间划分为多个窗口; 在每个窗口...

  KnIo2xqMjcu8   2023年11月02日   100   0   0 Go

原文链接: 上一篇文章介绍了如何实现计数器限流?主要有两种实现方式,分别是固定窗口和滑动窗口,并且分析了go-zero采用固定窗口方式实现的源码。 但是采用固定窗口实现的限流器会有两个问题: 会出现请求量超出限制值两倍的情况 无法很好处理流量突增问题 这篇文章来介绍一下令牌桶算法,可以很好解决以上两个问题。 工作原理 算法概念如下: 令牌以固定速率生成; 生成的令牌放入令牌桶中存放,如果令牌桶满了则多余的令牌会直接丢弃,当请求到达时,会尝试从令牌桶中取令牌,取到了令牌的请求可以执行; 如果桶空了,那么尝试取令牌的请求会被直接丢弃。 令牌桶算法既能够将所有的请求平均分布到时间区间内,又...

  KnIo2xqMjcu8   2023年11月02日   102   0   0 Go

原文链接:Go语言中排序的3种方法 在写代码过程中,排序是经常会遇到的需求,本文会介绍三种常用的方法。 废话不多说,下面正文开始。 使用标准库 根据场景直接使用标准库中的方法,比如: sort.Ints sort.Float64s sort.Strings 举个例子: s:=[]int{4,2,3,1} sort.Ints(s) fmt.Println(s)//[1234] 自定义比较器 使用sort.Slice方法排序时,可以自定义比较函数less(i,jint)bool,这样就可以根据需要按不同的字段进行排序。 如果想要稳定排序的话,就使用sort.SliceStable方法。 举个...

  KnIo2xqMjcu8   2023年11月02日   66   0   0 Go

原文链接:go-zero的自适应熔断器 上篇文章我们介绍了微服务的限流,详细分析了计数器限流和令牌桶限流算法,这篇文章来说说熔断。 熔断和限流还不太一样,限流是控制请求速率,只要还能承受,那么都会处理,但熔断不是。 在一条调用链上,如果发现某个服务异常,比如响应超时。那么调用者为了避免过多请求导致资源消耗过大,最终引发系统雪崩,会直接返回错误,而不是疯狂调用这个服务。 本篇文章会介绍主流熔断器的工作原理,并且会借助go-zero源码,分析googleBreaker是如何通过滑动窗口来统计流量,并且最终执行熔断的。 工作原理 这部分主要介绍两种熔断器的工作原理,分别是Netflix开源的Hyst...

  KnIo2xqMjcu8   2023年11月02日   38   0   0 Go

原文链接:GitCommitMessage应该怎么写? 最近被同事吐槽了,说我代码提交说明写的太差。其实都不用他吐槽,我自己心里也非常清楚。毕竟很多时候犯懒,都是直接一个-m"fix"就提交上去了。 这样做是非常不好的,我也是自食恶果,深受其害。特别是查看历史提交记录时,想通过提交说明来了解当时的功能变更,基本不可能,都得点进去看代码才行。 所以这两天看了一些如何写好提交说明的资料,系统地学习了一下。虽然团队没有这方面的要求,但是想要进步,得对自己提更高的要求才行。 一般使用git提交代码的话,可以使用-m参数来指定提交说明,比如: $gitcommit-m"helloworld" 如果一行...

  KnIo2xqMjcu8   2023年11月01日   69   0   0 敏捷开发

原文链接:工作流引擎架构设计 最近开发的安全管理平台新增了很多工单申请流程需求,比如加白申请,开通申请等等。最开始的两个需求,为了方便,也没多想,就直接开发了对应的业务代码。 但随着同类需求不断增多,感觉再这样写可要累死人,于是开始了工作流引擎的开发之路。查找了一些资料之后,开发了现阶段的工作流引擎,文章后面会有介绍。 虽然现在基本上能满足日常的需求,但感觉还不够智能,还有很多的优化空间,所以正好借此机会,详细了解了一些完善的工作流引擎框架,以及在架构设计上需要注意的点,形成了这篇文章,分享给大家。 什么是工作流 先看一下维基百科对于工作流的定义: 工作流(Workflow),是对工作流程及...

  KnIo2xqMjcu8   2023年11月01日   52   0   0 架构设计

原文链接:使用RediSearch在Redis中进行全文检索 Redis大家肯定都不陌生了,作为一种快速、高性能的键值存储数据库,广泛应用于缓存、队列、会话存储等方面。 然而,Redis在原生状态下并不支持全文检索功能,这使得处理文本数据变得相对困难。但是在有一些场景下还需要这样的功能,有什么好办法呢?答案就是RediSearch。 RediSearch是Redis的一个插件,它为Redis数据库添加了全文搜索和查询功能,使开发人员能够在Redis中高效地执行全文检索操作。 它基于RedisModuleAPI构建,通过使用自定义的数据结构和索引算法,实现了高效的全文搜索功能。 安装 如果单纯用...

  KnIo2xqMjcu8   2023年11月01日   135   0   0 NoSQL
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~