![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go
文章平均质量分 73
季布,
每一个你不满意的现在,都有一个你没有努力的曾经。
展开
-
Go 快速开发朋友圈助力项目
问题:当我们投票的时候,我们更新的是数据库,这个时候如果不更新redis,在缓存没有过期的这个时间段,它的排行榜是不变的,所以要优化一下投票的代码。在models/user.go中定义结构体 验证用户名是否已存在 添加用户。在 controllers/user.go中编写注册功能接口。controllers/common.go 对密码进行加密。登录信息保存在session redis中。前面是参赛选手的id 后面是分数。原创 2023-10-12 18:41:38 · 251 阅读 · 0 评论 -
基于 gin框架搭建入门项目
根目录下新建 runtime/log 目录用以保存生成的日志根目录下新建pkg/logger/logger.goimport ("fmt""io""net/http""os""path""time"// 设置日志格式为json格式})if err!原创 2023-10-11 18:10:45 · 3140 阅读 · 3 评论 -
Go 代码测试
在上⾯的测试代码中,我们可以看到⼀个BenchmarkBigLen函数,这个函数是Go语⾔当中性能测试的。作为⼀个优秀的开发者,任何代码可能的执⾏分⽀都应测试。⾄于单元测试,除了项⽬本身的代码外,还要提供专⻔针对某package或功能的测试⽂件。⽐如我们测试,新建⼀个⽬录animal,在⽬录下创建两个⽂件,⼀个是源码⽂件,⼀个是测试代码⽂。经过运⾏,我们看到代码测试覆盖率为75%,Eating测试不通过(我们⼈为造成的)。bench后⾯是⼀个正则表达式,如果只针对某⼀个函数测试,写具体的函数名称也可以。原创 2023-10-10 15:36:13 · 152 阅读 · 0 评论 -
Go channel同步
环将1,2,3,4,5传递给goroutine2,goroutine2负责将数字平⽅后传递给goroutine3,goroutine3。分析该应⽤,我们需要⾄少2个channel,3个goroutine,其中main函数可以直接是第三个goroutine,channel,在main函数中监控该channel,如果读到数据,则不执⾏后⾯的发射,直接return。此外,channel也。⽽这个单⽅向表述⾮常明。这是由于channel的知识点我们还需要知道,通道可以创建,也可以关闭,在读取的时候,也可以使⽤。原创 2023-10-10 14:32:55 · 193 阅读 · 0 评论 -
Go 并发编程
为了提⾼CPU的使⽤效率,我们需要启动多个Goroutine,⽽多个Goroutine⽐线程的颗粒度还⼩,他。造成影响,这样理论上来说,⼀个读的Goroutine上锁了,其余的读Goroutine理应也可以访问,这样。其实在我们之前写的代码中,都存在⼀个Goroutine,就是我们的主函。利⽤WaitGroup的特性,我们可以优雅的实现⼀个例⼦:启动10个Goroutine,让他们顺序退出,Goroutine在并发上则没有这⽅⾯的顾虑,可以随⼼所欲的启动,不⽤担⼼数量的问题,当然这归。原创 2023-10-09 18:51:37 · 211 阅读 · 0 评论 -
Go 文件操作
最后,输出切片中存储的文件数据,注意,读取的是从最开始到整个数据长度,因为有可能存储到切片中的数据达不到切片的总长度(也是切片时2k,但是从文件中读取的数据有可能只有1k)。以上就是我们常用的关于向文件中写入数据的方式,但是有同学可能有疑问,每次向文件中写入数据之前,都是先执行了,Create()这个函数,而这个函数的作用前面我们也已经说过。在向文件中写数据的时候,使用的是Write,那么读取文件中的数据,使用的是Read。Open()是打开文件,与OpenFile()的区别是,Open()只有读的权限。原创 2023-09-15 18:59:56 · 916 阅读 · 1 评论 -
Go 字符串处理
i := strings.Index(str1,str2)通过index关键字,在str1中查找str2的值,然后赋值给i,e这个值在hello woeld中能找到所以就会返回它的下标值,下标值是从0开始的,h是0,e就是1,所以结果为1。str1:= strings.Trim(str,“=”)通过Trim关键字对str中的=号做了去除头尾的处理,只要是str前面有=,或者后面有=都会去除。通过以上的讲解,发现字符串的处理是非常重要的,GO语言也提供了字符串与其它类型之间相互转换的函数。原创 2023-09-14 18:49:11 · 378 阅读 · 0 评论 -
Go 异常处理
也就是当遇到不可恢复的错误状态的时候,如数组访问越界、空指针引用等,这些运行时错误会引起panic异常,在一般情况下,我们不应通过调用panic函数来报告普通的错误,而应该只把它作为报告致命错误的一种方式。但是问题是,程序从上开始执行当执行到匿名函数时,虽然没有立即调用执行匿名函数,但是已经完成了参数的传递。前面讲解过,defer会延迟函数的执行,虽然立即调用了匿名函数,但是该匿名函数不会执行,等整个main()函数结束之前在去调用执行匿名函数,所以输出结果如上所示。随后,程序崩溃并输出日志信息。原创 2023-09-13 18:40:26 · 268 阅读 · 0 评论 -
Go 类型查询
我们知道interface的变量里面可以存储任意类型的数值(该类型实现了interface)。那么我们怎么反向知道这个变量里面实际保存了的是哪个类型的对象呢?原创 2023-09-11 18:35:37 · 252 阅读 · 0 评论 -
Go 接口和多态
接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接。为什么呢?原因就是,USB接口将规范和标准制定好后,各个生产厂商可以按照该标准生产鼠标和键盘就可以了。在程序开发中,接口只是规定了要做哪些事情,干什么。具体怎么做,接口是不管的。这和生活中接口的案例也很相似,例如:USB接口,只是规定了标准,但是不关心具体鼠标与键盘是怎样按照标准生产的.原创 2023-09-07 17:59:44 · 492 阅读 · 0 评论 -
Go 面向对象(方法)
在面向对象编程中,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些函数,这种带有接收者的函数,我们称为方法(method)。本质上,一个方法则是一个和特殊类型关联的函数。一个面向对象的程序会用方法来表达其属性和对应的操作,这样使用这个对象的用户就不需要直接去操作对象,而是借助方法来做这些事情。在Go语言中,可以给任意自定义类型(包括内置类型,但不包括指针类型)添加相应的方法。参数 receiver 可任意命名。如⽅法中未曾使⽤,可省略参数名。原创 2023-09-01 18:52:22 · 591 阅读 · 0 评论 -
Go 面向对象(匿名字段)
严格意义上说,GO语言中没有类(class)的概念,但是我们可以将结构体比作为类,因为在结构体中可以添加属性(成员),方法(函数)。面向对象编程的好处比较多,我们先来说一下“继承”,所谓继承指的是,我们可能会在一些类(结构体)中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类(结构体)中,作为这些类的父类(结构体),我们可以通过如下图来理解:当然严格意义上,GO语言中是没有继承的,但是我们可以通过”匿名组合”来实现继承的效果。原创 2023-08-30 17:07:33 · 581 阅读 · 0 评论 -
Go 指针
在调用Swap()函数时,将变量a与变量b的地址传分别传递给指针变量num1,num2,这时num1和num2,分别指向了变量a,与变量b的内存存储单元,那么操作num1,num2实际上操作的就是变量a与变量b,所以变量a与变量b的值被交换。这张图,大家也应该非常熟悉,是在讲解变量时,画的一张图,0x100010假设是变量i的内存地址(通过第二个输出可以获取实际的地址),内存地址的作用:在输出变量中存储的数据时,是通过地址来找到该变量内存空间的。我们前面定义了指针指向了数组,解决了数组引用传递的问题。原创 2023-08-30 14:31:13 · 574 阅读 · 0 评论 -
Go 结构体
现在有一个需求,要求存储学生的详细信息,例如,学生的学号,学生的姓名,年龄,家庭住址等。按照以前学习的存储方式,可以以如下的方式进行存储:通过定义变量的信息,进行存储。但是这种方式,比较麻烦,并且不利于数据的管理。在GO语言中,我们可以通过结构体来存储以上类型的数据,结构体的定义如下:type后面跟着的是结构体的名字Student, struct表示定义的是一个结构体。大括号中是结构体的成员,注意在定义结构体成员时,不要加var。原创 2023-08-29 18:41:24 · 640 阅读 · 0 评论 -
Go Map
定义字典结构使用map关键字,[ ]中指定的是键(key)的类型,后面紧跟着的是值的类型。键的类型,必须是支持==和!下面定义一个字典m,键的类型是整型,值的类型是字符串。定义完后,直接打印,结果为空nil。注意:字典中不能使用cap函数,只能使用len()函数。len()函数返回map拥有的键值对的数量以上代码值为0,也就是没有值。以上代码值为0,也就是没有值。当然也可以指定容量。输出的len值还是0,因为这里并没有赋值。接下来可以给字典m2进行赋值,并且指定容量,如果容量不够自动扩容。原创 2023-08-28 18:00:53 · 478 阅读 · 0 评论 -
Go 切片
通过以上案例,发现在主函数main()中,定义了一个切片s,然后调用InitData()函数,将切片s作为实参传递到该函数中,并在InitData()函数中完成初始化,该函数并没有返回值,但是在主函数中直接打印切片s,发现能够输出对应的值。在这里重点要理解的是:s6 := array[2:5],将array切片中的array[2],array[3],array[4]截取作为新切片s6,实际上是切片s6指向了原切片array(在这里并不是为切片s6新建一块区域)。因为,切片的长度是指的是初始化的空间。原创 2023-08-28 16:51:40 · 689 阅读 · 0 评论 -
Go 数组
当定义完成数组a后,就在内存中开辟了10个连续的存储空间,每个数据都存储在相应的空间内,数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。数组定义也是通过var关键字,后面是数组的名字a,长度是10,类型是整型。第一次循环i等于1,然后赋值给a[i]也就是a[1],然后a[1]也刚好等于1,然后循环十次。a数组中的元素类型是整型,定义完成后,直接输出,结果全部是0。i变量存储的是数组的下标,data变量存储的是数组中的值。像以上情况,最好是通过数组的方式来存储。原创 2023-08-21 11:04:01 · 353 阅读 · 0 评论 -
Go 流程控制
一只公鸡值5钱,一只母鸡值三钱,三只小鸡值一钱,现在用百钱买买鸡,公鸡,母鸡,小鸡各多少只。原创 2023-08-15 18:30:16 · 455 阅读 · 0 评论 -
Go 基本类型
【代码】Go 基本类型。原创 2023-08-15 16:20:42 · 44 阅读 · 0 评论 -
Windows安装Go开发环境
首先进入我的C盘(你放到其他盘也行),新建一个文件夹,名字叫做mygo(这个就是你的工作目录),然后再进入这个mygo文件夹,到里面再新建一个文件夹,名字叫做src(用来存放代码)。可以去淘宝买个全家桶激活码。原创 2023-08-15 12:21:58 · 361 阅读 · 0 评论