
Golang
文章平均质量分 66
玩家_名狱
不积跬步,无以至千里
展开
-
protoc生成gRPC代码和HTTP网关代码
为什么需要网关层,因为grpc调用是用于程序内部的远程调用协议,但是我们测试接口的时候通常使用http协议,http协议是应用层的协议,和grpc不相通,因此我们希望有一层可以帮我们转换,把我们调用的http协议数据转下格式,然后发给grpc服务接口,这就是这个网关做的事情。原创 2022-10-10 01:31:20 · 2186 阅读 · 1 评论 -
Golang函数返回值少用对象
NewMySQL()内部返回nil,但实际上这份方法定义了返回一个结构体指针,类型是结构体,值是指针,nil只是填充了值,类型依旧是*main.MySQL类型。然后把这个返回值赋给Dao接口,同样的,这个Dao接口类型没有变,只是值为nil。所以在判断是否为nil时,由于类型不为nil,导致判断结果不为nil。2、然后要知道一个东西,interface包含类型和值,只有类型和值都为空时,这个interface才等于nil。只有值为nil,但是类型不为nil时,这个interface是不等于nil的。原创 2022-10-09 18:48:06 · 733 阅读 · 0 评论 -
golang方法参数的封装
假如有一个对象,下面有个方法需要对很多参数做一些处理,这些参数可以由开发者自定传参,可传可不传,可传一也可传多,一般这种信息有时是不重要的,但是实际中不能缺少。如果是对于使用者而言,参数多也很正常,但是对于第三方库的开发者来说,代码太丑了,那么就需要封装一下。假如不封装你会这样一个一个的传,Parameter参数越多,方法的形参越多。稍微封装亿点点之后,自由度就高了,想修改哪个参数就传哪个。......原创 2022-08-01 21:53:30 · 413 阅读 · 0 评论 -
Golang sort包排序(详细全集)
文章目录一、整型倒序二、浮点型三、字符串型四、真的使用的是快速排序算法吗?五、稳定性六、结构体类型排序原创 2021-12-05 17:44:19 · 14870 阅读 · 6 评论 -
Golang单例模式
单例模式有两种方式,这里介绍框架中经常使用且简单的一种不多废话,直接看图,右上角是文件目录结构。dangli.go 是实现单例模式的重点,其他文件只是测试调用的。其中核心思想是,有个全局的变量保存对象地址,有个函数用于返回对象,函数里面判断全局对象是否被实例化,如果已经实例化,则直接返回,如果没有实例化,则先实例化再返回var Conn *Ceshifunc NewObj() *Ceshi { if Conn == nil { Conn = &Ceshi{} return Co原创 2021-12-05 01:01:04 · 635 阅读 · 2 评论 -
golang中orm或gorm或json序列化结构体时零值的处理
golang中平常写orm的结构体时,可以通过工具快速生成数据表的映射结构体http://sql2struct.atotoa.com/生成的结构体或者自己写的结构体大概是这样子的type Dianpu1 struct { Id int `orm:"id" json:"id"` //自增主键 UserName string `orm:"user_name" json:"user_name"` //用户名 UserAge int16 `orm:"user_a原创 2021-10-10 21:11:50 · 2815 阅读 · 1 评论 -
Golang net/http客户端的使用
测试连接:有个站点,专门为了测试http、https请求,get请求为http://httpbin.org/get、post请求为http://httpbin.org/post、put请求为http://httpbin.org/put等等。发送一个请求给它,他就根据我们请求内容返回我们的请求内容给我们,这样我们就可知道我们发送的结果是什么了。下面模拟各种方法的请求,各个方法的创建基本都差不多,但是由于Get和Post方法经常使用,所以官方帮我们做了包装,我们只需要一个函数调用就可以了,但是没有包装其他的方原创 2021-07-21 23:17:46 · 1461 阅读 · 1 评论 -
Golang使用验证码
使用的第三方库go get github.com/dchest/captchapackage mainimport ( "fmt" "github.com/dchest/captcha" "io" "log" "net/http" "text/template")var formTemplate = template.Must(template.New("example").Parse(formTemplateSrc))func showFormHandler(w http.转载 2021-06-20 17:58:24 · 1535 阅读 · 0 评论 -
Golang发送邮件
在设置->账户中开启两个服务,然后生成授权码,复制授权码,后面使用到。package mainimport ( "log" "net/smtp" "github.com/jordan-wright/email")func main() { e := email.NewEmail() //设置发送方的邮箱 e.From = "自己的邮箱@qq.com" // 设置接收方的邮箱 e.To = []string{"发送目标的邮箱@qq.com"} //设置主题 e.Sub转载 2021-06-20 17:04:40 · 500 阅读 · 0 评论 -
Golang操作Rabbitmq
简介Rabbitmq就是一个消息的中间人,负责接受消息、转发消息和存储消息,并不参与消息的处理和计算。没有固定哪一方是生产者,哪一方是消费者,谁发送消息给Rabbitmq谁就是生产者,谁接收Rabbitmq发送的消息谁就是消费者。Rabbitmq这个词是描述整个软件,而缓存消息的是这个软件内部的队列(或者说缓冲器,先进先出结构),内部可以后很多条队列,由于不参与计算,所以队列的性能只受内存和磁盘的约束。一个生产者可以对应一个或者多个队列,一个队列可以对应一个或者多个消费者,并且传输过程中又很多处理方法原创 2021-06-19 16:32:39 · 2034 阅读 · 0 评论 -
Golang操作MySQL数据库
文章目录事先准备插入数据查询数据更新操作删除数据事务操作事先准备go下载两个东西:MySQL驱动工具go get github.com/go-sql-driver/mysql 对mysql驱动的封装,方便我们使用API操作go get github.com/jmoiron/sqlx创建数据库和表# 新建名为gomysql的数据库create database gomysql;# 使用这个数据库use gomysql;# 创建一张名为person的表CREATE TABL原创 2021-05-31 01:35:45 · 391 阅读 · 0 评论 -
Golang操作Redis
安装第三方库go get -u github.com/garyburd/redigo/redis连接操作package mainimport ( "fmt" "github.com/garyburd/redigo/redis")func main() { redisObj, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("连接失败", err) return } defer原创 2021-05-30 23:29:06 · 762 阅读 · 0 评论 -
Golang使用net/http包写http服务端
文章目录一、处理器 Handler二、处理器函数 HandleFunc三、使用原理四、请求多路复用器使用 net/http 标准库实现 http服务端,通常有两种方式,分别是处理器和处理器函数。一、处理器 Handler下面实现两个页面,每个页面使用一个处理器,处理器处理的必须是一个实现了Handler接口的对象,Handler接口要求对象里面必须有一个ServerHTTP方法,且对方法的参数也有要求,如下:package mainimport ( "net/http")type Say原创 2021-05-25 16:29:07 · 924 阅读 · 2 评论 -
Golang的i/o对象及操作
参考:http://c.biancheng.net/view/5569.html无论是实现 web 应用程序,还是控制台输入输出,又或者是网络操作,都不可避免的会遇到 I/O 操作。Go语言标准库的 bufio 包中,实现了对数据 I/O 接口的缓冲功能。这些功能封装于接口 io.ReadWriter、io.Reader 和 io.Writer 中,并对应创建了 ReadWriter、Reader 或 Writer 对象,在提供缓冲的同时实现了一些文本基本 I/O 操作功能。我们平常使用的字符串并.原创 2021-05-04 14:24:51 · 306 阅读 · 0 评论 -
Golang实现事件系统
参考:http://c.biancheng.net/view/71.html事件系统基本原理事件系统可以将事件派发者与事件处理者解耦。例如,网络底层可以生成各种事件,在网络连接上后,网络底层只需将事件派发出去,而不需要关心到底哪些代码来响应连接上的逻辑。或者再比如,你注册、关注或者订阅某“大V”的社交消息后,“大V”发生的任何事件都会通知你,但他并不用了解粉丝们是如何为她喝彩或者疯狂的。一个事件系统拥有如下特性:能够实现事件的一方,可以根据事件 ID 或名字注册对应的事件。事件发起者,会根据.原创 2021-05-02 12:46:47 · 898 阅读 · 0 评论 -
服务发现consul的使用
下载安装wget https://releases.hashicorp.com/consul/1.9.4/consul_1.9.4_linux_amd64.zipunzip consul_1.9.4_linux_amd64.zipmv consul /usr/local/bin常用的几个命令agent该指令是consul的核心,它运行agent来维护成员的重要信息、运行检查、服务宣布、查询处理等等。consul agent-bind=0.0.0.0 指定 consul所在机器的原创 2021-04-18 20:25:14 · 330 阅读 · 0 评论 -
Windows中vscode安装golang插件问题解决
在Windows中,编译器默认安装C:\Program Files\Go配置用户环境变量添加用户变量GOPATH变量设置用户工作目录。如果写代码时要用到第三方库,然后使用go get xxx时,xxx就下载到这个目录。变量 GOPATH 值 C:\Program Files\Go\binGOROOT变量设置Go编译器的安装位置变量 GOROOT 值 C:\Program Files\Go配置go的环境变量在命令行下使用go env命令可以看到所有关于go的环境原创 2021-03-27 13:45:12 · 5143 阅读 · 0 评论 -
Golang高并发安全(一)
一、场景很多时候,我们希望加载配置时只加载一次,因为如连接数据库时较慢且不必加载多次;我们希望关闭通道时只关闭一次,因为关闭多次会报错;我们希望访问一个公共资源时,该资源是完整可靠的。二、介绍Golang语言的sync包中的sync.Once可以帮助我们只执行一个场景,其内部只有一个func (o *Once) Do(f func()) { }方法。该方法不能传递参数,所以有这需求时,可以使用闭包解决。三、问题的引出下面模仿我们平常不正确的写法,现在有一个场景:有很多个协程要使用到配置资源,一般先原创 2021-03-26 21:53:47 · 553 阅读 · 0 评论 -
Golang等待协程运行结束
sync.WaitGroup可以使得我们很优雅的等待协程的退出,还可以辅助控制协程的数量写一个普通的例子。下面的例子中,say函数中的字符串不会输出,因为main函数也是一个协程,say函数相当于一个子协程,父协程运行完退出后,子协程也会退出,并不会等待子协程中的任务完成,而要想执行完子协程中的任务,最简单的方法是让父协程等待一段时间,子协程可以在这段时间内执行完任务。去掉下面的注释后,say函数就可以执行完内部的任务。package mainimport ( "fmt" "time")f原创 2021-03-26 19:04:20 · 1110 阅读 · 0 评论 -
RPC是什么?Go语言使用它
RPC是远程过程调用协议的缩写,简单说就是他可以在本地网络下,调用远方的一个进程中的方法。比如我在广州自己的电脑上运行自己写的一个程序,该程序使用了RPC协议,然后就可以调用远在北京的一个程序,该程序当然也使用了RPC协议。这样的话就可以屏蔽了语言的差异,比如本地可以用C或Python语言写,远端可以使用JAVA或GO语言写。他们之间使用的是网络通信,为了保证数据传输的稳定性和安全性,使用TCP进行连接,所以RPC算是位于传输层和应用层之间。我们进行网络编程一般使用Socket编程,相比TCP编程,So原创 2021-03-10 00:19:09 · 252 阅读 · 0 评论 -
golang单元测试
为什么要进行单元测试?(该段装载于知乎)提高代码质量。代码测试都是为了帮助开发人员发现问题从而解决问题,提高代码质量。尽早发现问题。问题越早发现,解决的难度和成本就越低。保证重构正确性。随着功能的增加,重构(修改老代码)几乎是无法避免的。很多时候我们不敢重构的原因,就是担心其它模块因为依赖它而不工作。有了单元测试,只要在改完代码后运行一下单测就知道改动对整个系统的影响了,从而可以让我们放心的重构代码。简化调试过程。单元测试让我们可以轻松地知道是哪一部分代码出了问题。简化集成过程。由于各个单元已经原创 2021-03-07 01:04:43 · 175 阅读 · 0 评论 -
GO语言的package怎么使用
以Python作为对比,在Python中如果要使用自己写的库,该库可以在当前或当前子目录下,假设在当前目录下,你需要在当前目录下新建一个__init__.py的空文件,这样在当前目录下的工作文件中可以使用import xxx导入自己写的库。Go的package关键字定义该文件所属包,然后使用import关键字调用包。以实例讲解,首先有如下的目录结构,当前在GOLANG目录下,learn.go是主文件,GOLANG下面有一个say的文件夹,say文件夹下有一个test.go文件其中的learn.go文件原创 2021-02-25 18:53:54 · 649 阅读 · 0 评论