
GO
鹿灏楷silves
不要人夸颜色好,只留清气满乾坤
展开
-
go get失败解决方法
首先,由于网络原因,国内可能使用dgo get不能正常访问。两种解决方法:添加代理使用git下载添加代理具体可以看这个网站七牛云代理使用git下载比如我们下载gin框架我们先找到gin框架的所在github的地址github-gin我们先将代码拉到本地。git clone https://ghproxy.fsofso.com/https://github.com/gin-gonic/gin.git#这里最好使用代理拉取,并且是没有缓存的代理,如果是有缓存的代理,可能导致没有下载到原创 2022-04-27 20:53:15 · 4877 阅读 · 0 评论 -
rabbitmq——交换机fanout和direct
交换机:生产者将消息发送到交换机上,根据交换机不同的种类,将消息体按照不同的规则转发给不同的消费者。fanout此模式是将生产者生产的消息,通过交换机绑定的所有队列,发送到所有绑定到此交换机上的队列。product.go...原创 2022-03-04 20:17:35 · 3820 阅读 · 1 评论 -
rabbitmq——持久化消息
使用rabbitmq做持久化消息,我们有两种方式。使用自动确认机制,如果使用这种机制,消费者接收到消息之后自动确认,但是如果接收到消息之后,服务卡顿,就会导致这条消息不会重新发送给其他或者重启之后的消费者所在的服务器。导致间接性消息丢失。使用手动确认机制,当消息接收到之后,不要立即确认收到,而是先处理,处理之后,再确认这条消息。product.goque , err := c.QueueDeclare("hello-test" , false , false , false , false ,原创 2022-03-04 16:39:18 · 3811 阅读 · 0 评论 -
docker常用命令
docker search#搜索镜像docker search tomcat#搜索官方镜像docker search tomcat --filter "is-official=true"#搜索star大于5的镜像docker search tomcat --filter-stars=5#搜索镜像,返回5条数据docker search tomcat --limit=5docker ps#显示正在运行的容器docker ps#显示创建过的容器docker ps -a#显原创 2022-02-22 17:28:02 · 2372 阅读 · 0 评论 -
Golang之gc
常见的GC算法引用计数法根据对象自身引用计数来判断是否被回收,当自身引用数为0时,对象会被回收优点:简单直接,回收速度快缺点:每个对象都要维护一个自身的引用数,需要额外的开销。...原创 2022-01-22 15:18:26 · 2262 阅读 · 0 评论 -
golang之gmp调度模型
原始调度模型我们把线程分为内核级线程和用户态线程,内核级的线程在切换线程时,开销比较大,需要系统调用,但是,用户态线程不是这样,用户态的线程之间的切换不需要系统调用,从而把切换的开销比较小。golang开始并没有使用gmp调度模型,只有gm。也就是说没有局部队列,每一个m执行完一个g之后,从全局队列中拿到一个g运行,这样的结果就是每一个m从全局队列中拿取g时,都要对全局队列加锁。这也是导致原始调度模型效率低的一个原因。GMP调度模型G:goroutine ,协程,用户态线程M:thread,对应原创 2022-01-19 13:21:53 · 3620 阅读 · 0 评论 -
Rabbitmq入门
Rabbitmq使用demorabbitmq分为生产者和消费者,生产者是创建消息,消费者是使用消息。先写生产者。package mainimport ( "fmt" "github.com/streadway/amqp" "log" "time")func main() { //链接rabbitmq服务器 con, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { log.Print原创 2022-01-18 11:07:34 · 2946 阅读 · 0 评论 -
Go——cap
先分析这段代码:package mainimport "fmt"func main() { var SliceNumber []int = []int{1, 2, 3, 4, 5, 6, 7, 8} var SliceNumbert []int = make([]int, 0) var SliceNumberf []int = make([]int, 0) SliceNumbert = SliceNumber[:5] SliceNumberf = SliceNumber[2:] fmt原创 2021-11-01 20:23:50 · 606 阅读 · 0 评论 -
GO消息队列——rabbitmq
Rabbitmq应用场景流量削峰,当大流量访问时,可以将服务进行排队,对大流量削峰异步,可以将用户的操作排入队列,先行返回原创 2021-09-01 09:59:33 · 942 阅读 · 0 评论 -
二分算法几种应用和技巧
首先,我们使用二分算法来进行快速查找,二分算法适用于有序数组。二分算法需要注意的点循环退出的条件是low<=high,而不是low<high。mid的取值是mid := low + (high - low ) >> 1,位运算进行除法。low和high的更新,low =mid +1,high =mid - 1。二分算法的应用查找第一个与target相等的数查找最后一个与target相等的数查找第一个大于等于target的数查找最后一个小于等于target的数原创 2021-07-12 09:33:19 · 796 阅读 · 0 评论 -
leetcode——两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-numbers著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。首先分析此题,为链表加法,并且低位和还要进位。两种方法:链表转原创 2021-07-09 14:59:34 · 998 阅读 · 0 评论 -
Golang之strings包
strings包实现了操作字符的简单方法index系列方法原创 2021-05-28 20:54:30 · 879 阅读 · 1 评论 -
Golang类型赋值易错点
创建一个值类型,并进行赋值package mainimport ( "fmt")type Myint intfunc main () { var i int = 0 var t Myint = i fmt.Println(i , t)}这个代码能否编译通过?答案是不能,因为我们创建了一个新的值的类型,Go语言是强类型语言,我们不能将不同值类型的语言进行赋值改变一下代码package mainimport ( "fmt")type Myint = intfunc mai原创 2021-05-28 10:35:07 · 763 阅读 · 0 评论 -
Golang之strconv包
strconv包,实现了基本数据格式与字符串之间的转换首先介绍两个最长用的方法//将字符串转换成int型数据func Atoi(s string) (i int, err error)//将int数据转换成字符串类型func Itoa(i int) stringParse系列方法总的来说此系列的方法,就是将字符串类型的数据转换为其他格式数据类型//将字符串转换成bool类型的数据格式,会识别1,0,t,f,T,F,True,False,TRUE,FALSEfunc ParseBool(s原创 2021-05-28 10:10:57 · 1158 阅读 · 0 评论 -
Golang之os,bufio,ioutil包常用方法
操作文件的包有os,bufio,ioutil包首先介绍os包常用方法//将打开文件时产生的error作为参数传递,如果文件不存在,则返回falsefunc IsExist(err error) bool//打开文件产生的error,作为参数传递,如果是因为没有权限而产生错误,则返回truefunc IsPermission(err error) bool//返回当前的路径func Getwd() (dir string, err error)//根据不同权限创建目录func Mkdir(n原创 2021-05-27 21:18:02 · 935 阅读 · 0 评论 -
Golang之Time包
time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。//根据传入的时间的参数,生成time类型的时间的值func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time//根据先在的时间生成值func Now() Time//将字符串转换为Time类型的值,2006-01-02 15:04:05func Parse(layout, value string) (Time, erro原创 2021-05-26 13:00:01 · 830 阅读 · 0 评论 -
Goalng之fmt包
fmt包接口比较多介绍一下输出的方法输出的方法fmt.Print(),输出数据,不换行fmt.Println(),输出数据,换行fmt.Printf(),格式化输出数据向文件或者标准输出中输出内容func Fprint(w io.Writer, a …interface{}) (n int, err error)向w中输出内容func Fprintf(w io.Writer, format string, a …interface{}) (n int, err error)向w中格式化输出原创 2021-05-25 18:41:10 · 686 阅读 · 0 评论 -
Golang之context包
context经常发挥的作用:多个goroutine之间的信息交互进行超时控制上下文控制大概说明就是,进行进程之间的控制。常用的方法有:Background(),WithCancel(),WithDeadline(),Background()Background()方法,初始化一个空的context,没有过期时间,一般用在多线程的根部。WithCancel()会继承一个context,如果父context被结束,或者超时,则子context也会被结束。和Background()不同之处在原创 2021-05-24 20:12:23 · 755 阅读 · 0 评论 -
线程安全,数据竞争
首先,我们看一下这个代码var l sync.WaitGroupvar t = make([]int , 0)func main () { go ap() go ap() l.Add(2) l.Wait() fmt.Println(len(t))}func ap() { for i := 0 ; i <5000 ; i ++ { t = append(t , i) } l.Done()}问,输出的是什么?//如果按照目标来说,应该输出10000,但是并不是,你会发原创 2021-05-12 20:50:16 · 667 阅读 · 0 评论 -
高并发下全局变量数据冲突和基于缓存技术进行mysql读写优化
最近使用Go写了一些接口,由于高并发的需求,所以,在数据库的读写方面需要进行优化,但是sql的读写,也是优化sql语句,怎么样才能进行读写时,先不在数据库中查找,查找某一个位置,如果没有再进行数据库查找。这时想起了缓存,我们可以建一个结构体切片,数据库读写,先在结构体切片中查找,如果找不到,再进行数据库查找,在数据库中找到后,再放到切片中,用于下次使用,定时的进行清空切片,如果插入数据,更新数据,也是先在切片中进行更新插入,再统一进行数据库的操作。于是,用到了切片,还有append()但是这就是错误的原创 2021-04-30 16:58:19 · 876 阅读 · 1 评论 -
golang使用grpc+go-kit模拟oauth认证
我们使用grpc对外的接口,进行服务,模拟对外认证的接口首先我们要了解原创 2021-04-10 16:39:18 · 1180 阅读 · 0 评论 -
consul的grpc健康检查
开始使用go-kit进行开发接口,我都会写一个health接口,用于consul的健康检查。其实开始也想过,如果每一个人都对健康检查接口开发出一个不同的请求体,如果这样,consul怎样对health的接口进行调用呢,但是当时只是一闪而过的想法,并没有想太多,直到我看到注册的服务报红我才意识到,健康检查的接口不应该这么写。这次我们进行健康检查的接口开发。首先,我们需要实现consul封装的特定的接口type HealthServer interface { // If the requested原创 2021-04-07 22:42:23 · 1962 阅读 · 0 评论 -
go-kit组件使用hystrix中间件
使用go-kit中间件时,一般在endpoint中进行中间件的开发。在endpoint层插入hystrix中间件的插入。endpoint.go在这里插入代码片原创 2021-04-07 21:05:51 · 927 阅读 · 0 评论 -
nginx反向代理和负载均衡入门
由于是入门博客,这里介绍初步的代理和负载均衡首先,区分好正向代理和反向代理的区别正向代理是在用户端进行的代理。比如访问某个网站,如果这个网站只能是局域网能访问,不能在外网进行访问,我们可以开同一个端口,可以让外网进行访问的端口,我们在外网访问时,可以访问这个端口,通过这个端口,再进行访问局域网内才能访问的端口,这就是正向代理。大意就是正向代理,是代理的客户端反向代理我们通过一个端口访问服务器,但是服务端不想暴露真实服务的端口给客户端,这时,服务端可以通过反向代理,通过让客户端范访问一个端口,通过原创 2021-04-03 22:33:53 · 797 阅读 · 0 评论 -
go-kit+grpc+consul开发实战
基于go-kit开发grpc接口,并使用go-kit注册到consul中。如果不知道go-kit几个层级,那么这篇文章不适合你,先去看go-kit基础,再来看这篇文章我们首先编写proto文件编写好proto文件之后,进行代码生成protoc --go_out=plugins=grpc:./ ./test.proto利用go-kit实现接口,go-kit实现的接口,只用于数据透传,并调用底层endpoint,并不做逻辑执行...原创 2021-04-02 13:41:57 · 1929 阅读 · 0 评论 -
Golang原生rpc(rpc服务端源码解读)
创建rpc接口,需要几个条件方法的类型是可输出的方法的本身也是可输出的方法必须有两个参数,必须是输出类型或者是内建类型方法的第二个参数是指针类型方法返回的类型为errorrpc服务原理分析...原创 2021-03-27 11:01:10 · 1713 阅读 · 0 评论 -
使用go-kit组件进行服务注册与发现和健康检查
在go的微服务架构中,使用go-kit组件进行开发微服务type Reg struct { Host string Port int Client consul.Client}func MakeReg (host string , port int) (*Reg , error) { reg := api.DefaultConfig() reg.Address = host + ":" + strconv.Itoa(port) apiclient , err = api.NewClient原创 2021-03-27 11:00:44 · 3302 阅读 · 5 评论 -
go-micro、consul、rpc、gin构建微服务入门
使用micro构建微服务框架micro new --type "web" gwebmicro new --type "srv" trpc首先,将生成的文件进行更改,目前版本micro默认注册到etcd,所以需要指定注册到consul在main.go中reg := consul.NewRegistry(registry.Addrs(":8500"))service := web.NewService(//在原有的参数基础上,添加 web.Registry(reg),)我们还要结合gin原创 2021-03-24 13:13:45 · 1523 阅读 · 0 评论 -
Golang中的sync包的WaitGroup
sync的waitgroup功能WaitGroup使用多线程时,进行等待多线程执行完毕后,才可以结束函数,有两个选择channelwaitgroup首先使用channelfunc add (n *int , isok chan bool){ for i :=0 ;i <1000 ; i ++ { *n = *n + 1 } isok <- true}func main () { var ok = make(chan bool , 2) var i,u = 0,0原创 2021-03-23 12:38:16 · 873 阅读 · 0 评论 -
golang微服务熔断器的使用
熔断器的基本作用:作为检查服务是否有效,避免大量请求堵塞在一个失效请求,如果服务端失效,则会进行降级处理,可以自动进行第一个接口的请求,如果正常使用,自动进行调用第一个接口config := hystrix.CommandConfig{Timeout: 1000 , SleepWindow : 1000}//超时配置,此时为了测试,如果超时一秒钟,则会进行业务转发,降级处理 //如果第一个接口失效,则间隔1000毫秒进行再次请求,如果正常使用,则业务仍会调用第一个接口hystrix.Configur原创 2021-03-22 21:10:37 · 882 阅读 · 0 评论 -
Go框架gin结合go-micro开发restfulapi 和调用api服务
先使用micro生成一个webmicro new --type "web" gweb生成的文件,默认是调用rpc服务进行调用,我们是使用gin+go-micro+protobuf开发restful服务也就是说生成的代码,除了注册服务的代码都可以删掉。mciro默认注册的不是consul服务,所以需要指定注册的服务。consulreg := consul.NewRegistry( registry.Addrs("127.0.0.1:8500")//consul默认端口为8500)servic原创 2021-03-21 20:44:06 · 1662 阅读 · 2 评论 -
Cannot call pointer method on ‘i.(Integer)‘报错
对于Golang语言实现接口的方法,我们可以绑定到结构体的地址,或者结构体上type User struct{ Name string Sex int}func (u User) GetName () { //绑定到结构体上}func (u *User) GetSex () { //绑定到结构体地址上}但是,我们在使用结构体方法时,通过接口进行对数据的断言,将断言后的数据进行调用结构体的方法,此时,如果方法绑定的是结构体的地址,就会报错func main() { var a In原创 2021-03-20 09:50:39 · 2819 阅读 · 0 评论 -
Golang模拟令牌桶进行对访问的限流
利用channel进行模拟令牌桶对访问进行限流。func FW(max int,duration time.Duration){//定义一个channel ,进行初始化 contain := make(chan bool , max) for i := 0 ; i<max ; i++{ contain <- true//写入channel } go func() {//开启一个线程 for { contain <- true time.Sleep(durat原创 2021-03-18 22:00:02 · 1226 阅读 · 0 评论 -
go-micro+grpc+web+consul微服务基于linux操作系统
这些天学习go-micro不断的踩坑,才有了这篇文章,大概是目前使用micro+grpc+consul+web最新的配置。首先为了和我同步,避免配置不相同,先说明一下我的环境go version go1.14.12 linux/amd64micro version 1.18.0Consul 0.6.4.devConsul Protocol: 3 (Understands back to: 1)系统是ubuntu-linux可以根据我的版本进行配置,可以大概率避免出错第一步开启consul首原创 2021-03-10 17:22:33 · 2296 阅读 · 0 评论 -
micro没有在consul中注册成功
使用micro创建微服务原创 2021-02-16 09:06:46 · 2517 阅读 · 0 评论 -
go数组变链表
func ll(nums []int, head *ListNode) *ListNode { fnode := head for _, num := range nums { temp := ListNode{Val: num} head.Next = &temp head = &temp } return fnode.Next}原创 2020-11-27 10:42:22 · 3804 阅读 · 0 评论 -
GO语言互斥锁
1:使用互斥锁,将公共资源锁住,只能一个goroutine进行使用,使用完成之后,进行解锁,解锁之后,才能可以让下一个goroutine进行使用package mainimport ( "fmt" "sync" "time")func main() { var lock sync.Mutex var i int = 1 go func() { lock.Lock() fmt.Println("func2初始状态", i) i++ defer lock.Unlock()原创 2020-09-25 15:40:20 · 3575 阅读 · 0 评论 -
GO语言闭包
利用go语言闭包,创建一个计数器,当然使用结构体也是可以,但是普通函数只是完成一定的任务,并没有存储的能力。利用闭包解决package mainimport "fmt"func main() { c:=createcounter(0)//调用函数 fmt.Println(c())//因为函数返回的是一个函数,所以继续调用返回函数,能够实现在原始的基础上加一 fmt.Println(c())//再加一}func createcounter(init int) func()int {//原创 2020-09-21 12:50:56 · 3134 阅读 · 0 评论 -
GO语言数组、切片、动态扩容
首先对于go语言的切片package mainimport "fmt"func main() { arr :=[...]int{1,2,3,4} sli1 :=arr[0:2] sli2 :=arr[2:4] fmt.Println("切片后的数组 sli1",sli1) fmt.Println("切片后的数组 sli2",sli2) sli2=append(sli2,5) fmt.Println("扩容后的数组",sli2) fmt.Println("扩容后原始数组",arr)原创 2020-09-20 21:08:47 · 4135 阅读 · 0 评论 -
GO语言与其他语言初步比较
main函数需要保存在名为main的包中,只有这样才能生成可执行文件,定义函数使用func,函数传参时,参数类型和名称相反func test(name string){ fmt.Println(name)}一个函数允许返回多个值,比如一个值和一个错误值,当有错误值返回时,尽量不要使用其他值,避免错误加重声明变量的两种方式:name1 :="xiang"var name = "xiang"//两种声明方式都可以,第一种方式简化了var//编译器也可以检测函数的返回值来确定变量类型.原创 2020-07-15 22:25:54 · 3679 阅读 · 2 评论