Go语言中的事务怎么使用

事务实践服务端在进行和数据库交互时,对于一些场景我们可能会使用事务来保证数据的幂等性。比如在一个更新的场景时基本操作流程时如下:开启数据库事务通过ID获取数据记录确认是否可以进行更新操作如果可以更新操作就更新记录提交事务如果遇到错误,就回滚事务在从数据库中获取数据时,可以通过锁行的方式防止其他服务或者程序也对这条记录进行操作,比如使用 select...forupdate 方式获取数据并锁定该记录。以下是简单的使用事务操作数据的的方法:func (user *UserResp) DeleteUser(ctx context.Context, id string) error {tx, err := user.db.BeginTx(ctx, nil)if err != nil {return err}defer func() {if err != ni...

Go语言生成随机数

在日常开发中,生成随机数是很常见的需求,Go语言有两种方式来生成随机数,分别由 math/rand 和 crypo/rand 库来提供。为什么会提供两种方式呢?其实两者是有区别的,math 提供的是伪随机数,生成的随机序列不是真正的随机;而 crypo 提供的随机数具有更好的随机性,可以满足密码对随机数的要求,但缺点是性能较差,据资料显示相差10倍左右。(一)math/rand伪随机数生成的随机数是确定的。相同的程序不管什么时间、在什么机器上执行,生成的随机数序列都是相同的。123456789funcmain(){fori:=0;i<10;i++{fmt.Printf("%d",rand.Intn(10))}}$gorunmain.go1779185060$gorunmain.go1779185060可以看到,程序执行多次产生的随机数是一样的,不够随机。我们可以通过设置随机种子,也可以理解为随机函数增加参数。12345678910funcmain(){rand.Seed(1009)fori:...
开发笔记 开发笔记·2024-02-24

go语言适合做什么

 Go语言目前在云计算、容器虚拟化、分布式存储、网络爬虫、运维开发、Web开发、服务端开发、区块链、IoT等领域都有所应用。  服务端开发  以前你使用C或者C++做的那些事情,用Go来做很合适,例如日志处理、文件系统、监控系统等;  爬虫及大数据  Go语言天生支持并发,所以十分适合编写分布式爬虫及大数据处理;  网络编程  大量优秀的Web框架如Echo、Gin、Iris、beego等,而且Go内置的net/http包十分的优秀;  Paas云平台领域  Kubernetes和DockerSwarm等;  分布式存储领域  etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;  区块链领域  区块链里面有两个明星项目以太坊和fabric都使用Go语言;  容器虚拟化  大名鼎鼎的Docker就是使用Go语言实现的。  Go语言在云计算、大数据、微服务、高并发领域应用应用非常广泛。Go语言Google公司开发,并于2009年开源,相比Java/python/c等语言Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为&ldquo...
开发笔记 开发笔记·2022-04-16

Ubuntu 搭建GO语言开发环境

一、下载Go语言安装包官网下载地址:https://golang.org/dl/,使用tar命令将档案包解压到/usr/local目录中:sudotar-C/usr/local-xzfgo1.11.5.linux-amd64.tar.gz二、添加环境变量和工作变量到系统环境中先进入到profile文件目录:cd/etc打开profile文件:sudogeditprofile把这下面的命令行添加到文件最末面:(第一个是go的安装包路径,第二个是你的开发空间,两个需要不同目录,否则会导致文件夹混淆)#GOexportPATH=$PATH:/usr/local/go/bin#GOPATHexportGOPATH=你的go工作空间目录exportPATH=$PATH:$GOPATH/bin针对所有用户的需要重启电脑才可以生效;针对当前用户的,在终端里使用source命令加载这个$HOME/.profile即可生效。source~/.profile三、查看当前go版本任一命令行终端:goversion如果输出类似如下,说明你的go安装环境和工作环境皆配置成功! 四、测试是否安装成功虽然...

Rabbitmq 消费者的推模式与拉模式(go语言版本)

   RabbitMQ的消费者有两种模式实现RabbitMQ的消费者有两种模式,推模式(Push)和拉模式(Pull)。推模式:消息中间件主动将消息推送给消费者拉模式:消费者主动从消息中间件拉取消息推模式将消息提前推送给消费者,消费者必须设置一个缓冲区缓存这些消息。好处很明显,消费者总是有一堆在内存中待处理的消息,所以效率高。缺点是缓冲区可能会溢出。拉模式在消费者需要时才去消息中间件拉取消息,这段网络开销会明显增加消息延迟,降低系统吞吐量。选择推模式还是拉模式需要考虑使用场景。推模式是最常用的,但是有些情况下推模式并不适用的,比如说:由于某些限制,消费者在某个条件成立时才能消费消息接受消息–推模式RMQServer主动把消息推给消费者func(ch*Channel)Consume(queue,consumerstring,autoAck,exclusive,noLocal,noWaitbool,argsTable)(<-chanDelivery,error)queue:队列名称。consumer:消费者标签,用于区分不同的消费者。autoAck:是否...

[翻译]Go语言调度器

本文翻译DanielMorsing的博文TheGoscheduler。个人认为这篇文章把GoRoutine和调度器的知识讲的浅显易懂。作为一篇介绍性的文章。非常不错。介绍Go1.1版本号最大的特性之中的一个就是一个新的调度器,由DmitryVyukov贡献。这个新的调度器为并行Go程序带来了令人激动、无以后继的性能提升。我认为我应该为之写点什么东西。这篇博客的大部分内容都已经在这篇原始设计文档中描写叙述过了,这是一份相当好理解的文章。可是略显技术性。尽管该设计文档已经包括了关于新调度器你所须要知道的一切。但本篇博文包括图片,所以非常明显它略胜一筹。为什么Go执行时须要一个调度器在我们研究这个新调度器之前,我们须要搞清楚为什么须要它,为什么要制造一个用户空间的调度器。即使操作系统已经能为你调度线程。POSIX线程API非常大程度上是现有UNIX进程模型的逻辑扩展,线程拥有很多与进程同样的控制。线程有自己的信号掩码,能够设置CPU亲和力,能够被分组到cgroups,也能够查询它们使用了哪些资源。全部这些控制由于一些Go语言使用Goroutine时并不须要的特性而添加了开销,而且当你的程序有...
代码星球 代码星球·2021-02-13

Go语言---小白入门-命令行库Cobra的使用

Cobra既是用于创建强大的现代CLI应用程序的库,也是用于生成应用程序和命令文件的程序。Cobra提供的功能:简易的子命令行模式,如appserver,appfetch等等完全兼容posix命令行模式嵌套子命令subcommand支持全局,局部,串联flags使用Cobra很容易的生成应用程序和命令,使用cobracreateappname和cobraaddcmdname如果命令输入错误,将提供智能建议,如appsrver,将提示srver没有,是否是appserver自动生成commands和flags的帮助信息自动生成详细的help信息,如apphelp自动识别-h,--help帮助flag自动生成应用程序在bash下命令自动完成功能自动生成应用程序的man手册命令行别名自定义help和usage信息可选的紧密集成的viper appsCobra是建立在结构的命令、参数和标志之上。命令(Commands)代表操作,参数(Args)和标志(Flags)是这些行动的修饰符。APPNAMECOMMANDARG--FLAG1.安装cobra首先,使用goget安装最新版本gog...

Go语言框架:Beego vs Gin 的区别

前言:一切语言、技术或者框架,本质都是工具,工具的价值在于为使用者提供竞争优势。一、Beego和Gin全方位比较MVCBeego支持完整的MVC,Gin不支持完整的MVC(需要开发者自己实现MVC)路由&SessionBeego支持正则路由,Gin不支持正则路由Beego支持Session,Gin不支持Session(需要安装另外的包)安装session,推荐包:github.com/astaxie/session性能二、适用场景Beego在业务方面较Gin支持的更多在业务更加复杂的项目中,适用Beego,在需要快速开发的项目中,适用Beego,在1.0项目中,适用Beego Gin在性能方面较Beego更好当某个接口的性能遭到较大挑战的时候,考虑使用Gin重写接口如果项目的规模不大,业务相对简单,使用Gin...
代码星球 代码星球·2021-02-13

GO语言从入门到放弃目录

第一个GO程序GO语言常量和变量GO语言数据类型GO语言流程控制GO值类型与引用类型区别GO语言数组GO语言切片GO语言mapGO语言数组,切片,MAP总结GO语言函数GO语言指针GO语言结构体Go语言接口GO语言Error处理GO语言并发GO语言测试GO语言网络编程GO语言html模板GO语言GIN框架入门GO语言的包GO语言运算符GO语言格式化打印go语言time包的使用Go语言文件操作GO语言strconv包的使用GO标准库flagGO操作MySQl学生管理系统(函数,结构体,方法)GO获取随机数...

GO语言GIN框架入门

Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架,由于使用了httprouter,速度提高了近40倍。中文文档安装GIN$goget-ugithub.com/gin-gonic/gin第一个Gin程序packagemainimport"github.com/gin-gonic/gin"funcmain(){//创建一个默认的路由引擎engine:=gin.Default()//GET:请求方式;/hello:请求的路径//当客户端以GET方法请求/hello路径时,会执行后面的匿名函数engine.GET("/hello",func(context*gin.Context){//返回JSON格式的数据context.JSON(200,gin.H{"message":"Helloares!",})})//启动HTTP服务,默认在0.0.0.0:8080启动服务engine.Run()}-----------------$curl127.0.0.1:8080/hello{"message":"Helloares!"}创建EngineEngine...

GO语言Error处理

Go语言没有提供像Java、C#、Python语言中的try...catch异常处理方式,而是通过函数返回值逐层往上抛。好处就是避免漏掉本应处理的错误。坏处是代码啰嗦。错误指的是可能出现问题的地方出了问题,比如打开文件失败。异常是不应该出现问题的地方出了问题,比如空指针。Go中的错误是一种类型,错误用内置的error类型(接口)来表示。错误可以存储在变量中,从函数中返回。typeerrorinterface{Error()string}创建自定义错误可用errors包下的New()函数以及fmt包下的Errorf()函数。//创建一个error的数据err1:=errors.New("自己创建...")fmt.Println(err1)fmt.Printf("%T",err1)//*errors.fundamental//创建一个error方法err2:=fmt.Errorf("错误码:%d",10000)fmt.Println(err2)//错误码:10000fmt.Printf("%T",err2)//*errors.errorString自定义错误示例//求矩形面积typeare...
代码星球 代码星球·2021-01-23

GO语言数组,切片,MAP总结

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会panic。数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。数组声明var数组变量名[元素数量]元素类型vara[3]int//声明一个长度为3的整形数组varcity=[...]string{"北京","上海","深圳"}//声明一个可变长度的字符串类型数组并且初始化数组定义必须指定长度。让编译器根据初始值的个数自行推断数组的长度...。切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。切片是一个引用类型,它的内部结构包含地址、长度和容量。切片声明var变量名称[]元素类型vara[]string//声明一个字符串切片varb=[]int{}//声明一个整型切片并初始化varc=[]bool{false,tru...

GO语言html模板

一个模板是一个字符串或一个文件,里面包含了一个或多个由双花括号包含的{{action}}对象。大部分的字符串只是按面值打印,但是对于actions部分将触发其它的行为。每个actions都包含了一个用模板语言书写的表达式,一个action虽然简短但是可以输出复杂的打印值,模板语言包含通过选择结构体的成员、调用函数或方法、表达式控制流if-else语句range循环语句,还有其它实例化模板等诸多特性。Action内部不能有换行,但注释可以有换行。示例模板执行时会遍历结构并将指针表示为’.‘(称之为”dot”)指向运行过程中数据结构的当前位置的值。用作模板的输入文本必须是utf-8编码的文本。Html示例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Hello</title></head><body><p>Hello{{.}}!</p></body></html>GO...
代码星球 代码星球·2021-01-23

GO语言网络编程

Socket是BSDUNIX的进程通信机制,通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。Socket可以理解为TCP/IP网络的API,它定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。电脑上运行的应用程序通常通过”套接字”向网络发出请求或者应答网络请求。Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket后面,对用户来说只需要调用Socket规定的相关函数,让Socket去组织符合指定的协议数据然后进行通信。TCP协议TCP/IP(TransmissionControlProtocol/InternetProtocol)即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transportlayer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。TCP服务端一个TCP服务端可以同时连接很多个客户端,Go语言中创建多个goroutine实现并发非常方便和高效,所以可以每建立一次链接就...
代码星球 代码星球·2021-01-23

GO语言测试

Go语言的测试技术是相对低级的。它依赖一个gotest测试命令和一组按照约定方式编写的测试函数,测试命令可以运行这些测试函数。编写相对轻量级的纯测试代码是有效的,而且它很容易延伸到基准测试和示例文档。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。在包目录内,所有以_test.go为后缀名的源代码文件都是gotest测试的一部分,不会被gobuild编译到最终的可执行文件中。类型格式作用测试函数函数名前缀为Test测试程序的一些逻辑行为是否正确基准函数函数名前缀为Benchmark测试函数的性能示例函数函数名前缀为Example为文档提供示例文档gotest命令会遍历所有的*_test.go文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。测试函数格式:测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头,参数t用于报告测试失败和附加的日志信息。funcTestName(t*testing.T){//...}testing.T的拥有的方法:func(c...
代码星球 代码星球·2021-01-23
首页上一页12345...下一页尾页