![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go
chengqiuming
这个作者很懒,什么都没留下…
展开
-
Beego orm 库进行 ORM 开发
一点睛beego orm是一个Go 进行 ORM 操作的库,它采用了 Go style 方式对数据库进行操作,实现了 struct 到数据表记录的映射。beego orm 是一个十分轻量级的 Go ORM 框架,这个库的本意是降低复杂的 ORM 学习曲线,尽可能在 ORM 的运行效率和功能之间寻求一个平衡,beego orm 是目前开源的 Go ORM 框架中实现比较完整的一个库,而且运行效率相当不错,功能也基本能满足需求。beego orm 是支持 database/sq l标准接口的 ORM .原创 2021-06-12 15:28:56 · 2576 阅读 · 0 评论 -
go web 使用 SQLite 数据库
一点睛SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保 SQLite 的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite 是绝对值得考虑。SQLite 可以说是开源的Access。二 驱动Go 支持 sqlite 的驱动也比较多,但是好多都是不支持 datab.原创 2021-06-12 14:25:27 · 366 阅读 · 0 评论 -
go 使用 MySQL 数据库
一 MySQL 驱动Go 中支持 MySQL 的驱动目前比较多,有如下几种,有些是支持 database/sql 标准,而有些是采用了自己的实现接口,常用的有如下几种。 https://github.com/go-sql-driver/mysql 支持database/sql,全部采用 go 写。 https://github.com/ziutek/mymysql 支持database/sql,也支持自定义的接口,全部采用 go 写。 https://github.com/Ph原创 2021-06-11 17:42:00 · 215 阅读 · 0 评论 -
go 中 database/sql接口
一点睛Go 官方没有提供数据库驱动,而是为开发数据库驱动定义了一些标准接口,开发者可以根据定义的接口来开发相应的数据库驱动,这样做有一个好处是:只要是按照标准接口开发的代码, 以后需要迁移数据库时,不需要任何修改。二 sql.Register该函数存在于 database/sql包,它的作用是注册数据库驱动,当第三方开发者开发数据库驱动时,都会实现 init 函数,在 init 里面会调用 Register(name string, driver driver.Driver) 完成数据库驱动..原创 2021-06-10 18:37:44 · 397 阅读 · 0 评论 -
go web 处理文件上传
一点睛goweb中怎样实现文件上传,下面一一道来。要使表单能够上传文件,第一步就是要添加 form 的 enctype 属性,enctype 属性有如下三种情况。1 application/x-www-form-urlencoded:表示在发送前编码所有字符(默认)。2 multipart/form-data:不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。3 text/plain:空格转换为"+"加号,但不对特殊字符编码。所以,创建新的表单html文件, 命名为up..原创 2021-06-09 19:09:26 · 909 阅读 · 0 评论 -
go web 防止多次递交表单
一问题提出当用户重复点击按钮,会出现多次提交表单 。二重复提交表单操作1 通常是鼠标的误操作,如双击了递交按钮。2 可能是为了编辑或者再次核对填写过的信息,点击了浏览器的后退按钮,然后又再次点击了递交按钮而不是浏览器的前进按钮。3还可能是故意,如在某项在线调查或者博彩活动中重复投票。三解决方案1 在表单中添加一个带有唯一值的隐藏字段。在验证表单时,先检查带有该唯一值的表单是否已经递交过了。如果提交过,拒绝再次递交;如果没提交过,则对提交的表单进行处理。2 如果是采用了...原创 2021-06-08 18:34:19 · 665 阅读 · 0 评论 -
go web 预防跨站脚本
一点睛现在的网站包含大量的动态内容以提高用户体验,比过去要复杂得多。所谓动态内容,就是根据用户环境和需要,Web 应用程序能够输出相应的内容。动态站点会受到一种名为“跨站脚本攻击”(Cross Site Scripting, 安全专家们通常将其缩写成 XSS)的威胁,而静态站点则完全不受其影响。攻击者通常会在有漏洞的程序中插入 JavaScript、VBScript、 ActiveX 或 Flash 以欺骗用户。一旦得手,他们可以盗取用户帐户信息,修改用户设置,盗取或污染 cookie 和植入恶意.原创 2021-06-07 19:37:58 · 216 阅读 · 1 评论 -
go web 验证表单的输入
一点睛开发 Web 的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要。我们经常会在微博、新闻中听到某某网站被入侵了,存在什么漏洞,这些大多是因为网站对于用户输入的信息没有做严格的验证引起的,所以为了编写出安全可靠的Web程序,验证表单输入的意义重大。平常编写 Web 应用主要有两方面的数据验证,一个是在页面端的 js 验证(目前在这方面有很多的插件库,比如 ValidationJS 插件),一个是在服务器端的验证,本篇是介绍如何在服务器端验证。二 必填字段.原创 2021-06-07 17:52:01 · 240 阅读 · 0 评论 -
go web 处理表单的输入
一目录结构c326.png二 前端页面文件名:login.html<!DOCTYPE html><html><head><title></title></head><body><form action="/login" method="post">用户名:<input type="text" name="username">密码...原创 2021-06-06 19:33:12 · 342 阅读 · 2 评论 -
Go 的 http 包详解
一 点睛Go 的 http 有两个核心功能:Conn、ServeMux。二 Conn 的 goroutine与一般编写的 http 服务器不同,Go 为了实现高并发和高性能,使用了 goroutines 来处理 Conn 的读写事件,这样每个请求都能保持独立,相互不会阻塞,可以高效的响应网络事件。Go 在等待客户端请求里面是这样写的。c, err := srv.newConn(rw)if err != nil {continue}go c.serve()可以看...原创 2021-06-06 12:10:32 · 3960 阅读 · 0 评论 -
Go 如何使得 Web 工作
一 web 工作方式的几个概念以下几个均是服务器端的概念。Request:用户请求的信息,用来解析用户的请求信息,包括 post、get、cookie、url 等信息。Response:服务器需要反馈给客户端的信息。Conn:用户的每次请求链接。Handler:处理请求和生成返回信息的处理逻辑。二 http 包运行机制Go 实现 Web 服务的工作模式的流程图c323.pnghttp包执行流程1 创建 Listen Socket,监听指定的端口, 等待客户端请求到来。原创 2021-06-04 18:47:47 · 196 阅读 · 0 评论 -
Go 搭建一个 Web 服务器
一 点睛Web 是基于 http 协议的一个服务,Go 语言里面提供了一个完善的 net/http 包,通过 http 包可以很方便的就搭建起来一个可以运行的 Web 服务。同时使用这个包能很简单地对 Web 的路由,静态文件,模版,cookie 等数据进行设置和操作。二 代码package mainimport ("fmt""log""net/http""strings")func sayhelloName(w http.Resp...原创 2021-06-02 17:36:49 · 758 阅读 · 0 评论 -
Web工作方式
一 点睛Web 是基于 http 协议的一个服务,Go 语言里面提供了一个完善的 net/http 包,通过 http 包可以很方便的就搭建起来一个可以运行的 Web 服务。同时使用这个包能很简单地对 Web 的路由,静态文件,模版,cookie 等数据进行设置和操作。二 代码...原创 2021-06-02 17:25:23 · 1214 阅读 · 0 评论 -
go实现二叉树
一代码package mainimport ( "fmt")type Hero struct { No int Name string Left *Hero Right *Hero}// 前序遍历:先输 root 结点,然后再输出左子树,然后再输出右子树func PreOrder(node *Hero) { if node != nil { fmt.Printf("no=%d name=%s\n", node.No, nod.原创 2021-06-01 17:50:59 · 341 阅读 · 0 评论 -
go实现哈希表
一点睛散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。c317.png三 使用 hashtable 来实现一个雇员的管理系统1需求有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id、性别、年龄、住址..),当输入该员工的 id 时,要求查找到该员工的 所有信息。要求:a 不使用数据库..原创 2021-05-31 18:13:10 · 991 阅读 · 0 评论 -
用go实现迷宫问题
一需求c315.png求从A到B的路径。二代码三测试原创 2021-05-31 18:06:47 · 317 阅读 · 0 评论 -
go中递归
一 递归的一个应用场景迷宫问题:A是入口,B是出口,怎样走。c315.png二 概念简单的说:递归就是函数/方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。三 递归入门应用1 打印问题2 阶乘问题3 快速入门图解c316.png四 递归用于解决什么样的问题1 各种数学问题八皇后问题、汉诺塔、阶乘问题、迷宫问题、球和篮子的问题(google 编程大赛)。2 将用栈解决的问题转换为递归解决,代码会比较简洁。.原创 2021-05-30 12:10:35 · 234 阅读 · 2 评论 -
go完成选择排序插入排序快速排序的性能测试
一选择排序1代码package mainimport ("fmt""math/rand""time")// 完成选择排序,从大到小func SelectSort(arr *[80000]int) {for j := 0; j < len(arr)-1; j++ {max := arr[j]maxIndex := j// 3 从 j+1 开始遍历,到 [len(arr) -1]...原创 2021-05-30 11:57:18 · 170 阅读 · 0 评论 -
go 通过栈实现综合计算器
一图解分析二代码package mainimport ( "errors" "fmt" "strconv")// 使用数组来模拟一个栈type Stack struct { MaxTop int // 栈最大可以存放数个数 Top int // 栈顶, 因为栈顶固定,因此我们直接使用 Top arr [20]int // 数组模拟栈}// 入栈func (this *Stack) Push(val int)..原创 2021-05-30 11:39:54 · 269 阅读 · 0 评论 -
go 实现栈
一点睛有些程序员也把栈称为堆栈,其实栈和堆栈是同一个概念。1 栈的英文为(stack)。2 栈是一个 先入后出(FILO-First In Last Out)的有序列表。3 栈(stack)限制线性表中元素的插入和删除。只能在线性表的同一端进行操作。允许插入和删除的一端,为变化的一端,称为 栈顶(Top), 另一端为固定的一端,称为栈底(Bottom)。4 根据堆栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删.原创 2021-05-30 11:15:41 · 1486 阅读 · 1 评论 -
go 实现快速排序
一点睛快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。二图解c312.png三代码...原创 2021-05-29 16:50:21 · 2621 阅读 · 0 评论 -
go 实现插入排序
一点睛插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。二 插入排序法思想插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。三图解c310.png四代码五测试...原创 2021-05-29 15:27:48 · 663 阅读 · 0 评论 -
go 实现选择排序
一点睛选择式排序属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。二 选择排序思想选择排序(select sorting)是一种简单的排序方法。它的基本思想是:第一次从 R[0]~R[n-1]中选取最小值,与 R[0]交换,第二次从 R[1]~R[n-1]中选取最小值,与 R[1]交换,第三次从 R[2]~R[n-1]中选取最小值,与 R[2]交换,…,第 i 次从 R[i-1]~R[n-1]中选取最小值,与 R[i-1]交换,.原创 2021-05-29 15:12:03 · 434 阅读 · 0 评论 -
go 环形单向链表实现约瑟夫问题
一 Josephu 问题Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。二分析用一个不带头结点的循环链表来处理 Josephu 问题:先构成一个有 n 个结点的单循环链表,然后由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点的下一个结.原创 2021-05-29 14:56:37 · 174 阅读 · 0 评论 -
go 实现单向环形单向链表
一需求完成单向环形链表的增加、删除和遍历。二图解c307.png三代码四测试原创 2021-05-27 19:08:21 · 218 阅读 · 0 评论 -
go 实现双向链表
一说明使用带head头的双向链表实现——水浒英雄排行榜管理。单向链表的缺点分析。1单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。2单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,单链表删除时,总要找到temp的下一个节点来删除。二图解三代码package mainimport ( "fmt")// HeroNodetype HeroNode struct { no int n...原创 2021-05-27 17:35:38 · 301 阅读 · 0 评论 -
go 实现单向链表
一点睛1 链表是有序的列表,它在内存中是存储如下。2单链表示意图一般来说,为了比较好的对单链表进行增删改查的操作,都会给它设置一个头结点,头结点的作用主要是用来标识链表头,本身这个结点不存放数据。二 单链表实战1 说明使用带 head 头的单向链表实现 –水浒英雄排行榜管理。完成对英雄人物的增删改查操作。2代码package mainimport ( "fmt")// HeroNodetype HeroNode struct { n...原创 2021-05-27 17:33:50 · 359 阅读 · 0 评论 -
2021-05-26
一点睛对数组模拟非环形队列进行优化,充分利用数组,可以将数组看做是一个环形的。通过取模的方式来实现。1尾索引的前一个为真正的尾节点,尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意。当(tail+1)% maxSize == head时,表示队列满。2tail ==head表示队列空。二 分析1当满足 (tail + 1) % maxSize = head时,表示队列满。2当tail == head 表示队列空。...原创 2021-05-26 18:15:55 · 112 阅读 · 0 评论 -
go 数组实现非环形队列
一 队列的应用场景银行排队二 队列介绍1 队列是一个有序列表,可以用数组或是链表来实现。2队列遵循先入先出的原则。即:先存入队列的数据,先取出。后存入的后取出。3 示意图——使用数组模拟队列说明:front指向首节点的前一个节点三 数组模拟队列1需求完成一个非环形的队列,要求数组来实现。2分析队列本身是有序列表,使用数组的结构来存储队列的数据,用maxSize来表示队列的最大容量。因为队列的输出和输入是分别从前后端来处理,因此需要两个变量fr...原创 2021-05-26 17:56:16 · 173 阅读 · 0 评论 -
go 实现稀疏数组
一 需求1 编写的五子棋程序中,有存盘退出和续上盘的功能。2用元素二维数组存储的问题因为二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据。二 点睛当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方式如下。1 记录数组一共有几行几列,有多少个不同的值。2 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。三 稀疏数组举例说明四分析1 使用稀疏数组,来保留类似前面的二维数...原创 2021-05-25 17:55:41 · 271 阅读 · 0 评论 -
数据结构和算法简介
一 数据结构(算法)的介绍1 数据结构的介绍a 数据结构是一门研究算法的学科,自从有了编程语言也就有了数据结构。学好数据结构可以编写出更加漂亮、更加有效率的代码。b 要学习好数据结构就要多多考虑如何将生活中遇到的问题用程序去实现解决。c 程序 = 数据结构 + 算法二 数据结构和算法的关系1 算法是程序的灵魂,为什么有些网站能够在高并发,和海量吞吐情况下依然坚如磐石?大家可能会说:网站使用了服务器群集技术、数据库读写分离和缓存技术(比如 Redis 等),那如果再深入的问一句,这些优原创 2021-05-24 18:09:31 · 250 阅读 · 0 评论 -
go 实现多人聊天系统测试
一注册测试1 服务端输出服务器在8889端口监听......等待客户端来链接服务器......等待客户端来链接服务器......读取客户端发送的数据...mes= &{RegisterMes {"user":{"userId":100,"userPwd":"123456","userName":"cakin1","userStatus":0,"sex":""}}}读取客户端发送的数据...readPkg err= read tcp [::1]:8889->[.原创 2021-05-23 16:48:21 · 443 阅读 · 1 评论 -
go 实现多人聊天系统服务端代码实现
一代码结构图二model包chatroom\server\model\error.gopackage modelimport ( "errors")// 根据业务逻辑需要,自定义一些错误。var ( ERROR_USER_NOTEXISTS = errors.New("用户不存在") ERROR_USER_EXISTS = errors.New("用户已经存在") ERROR_USER_PWD = errors.New("密码不正...原创 2021-05-23 16:29:49 · 1011 阅读 · 0 评论 -
go 实现多人聊天系统公共部分代码实现
一代码结构图二message包chatroom\common\message\message.gopackage message// 定义各种消息类型const ( LoginMesType = "LoginMes" LoginResMesType = "LoginResMes" RegisterMesType = "RegisterMes" RegisterResMesType = "R...原创 2021-05-23 16:14:32 · 177 阅读 · 0 评论 -
go 实现多人聊天系统客户端代码实现
一客户端目录结构图二model包chatroom\client\model\curUser.gopackage modelimport ( "chatroom/common/message" "net")// 因为在客户端,我们很多地方会使用到 curUser,所以将其定义为一个全局type CurUser struct { Conn net.Conn message.User}三utils包chatroom\client\utils...原创 2021-05-23 16:09:55 · 260 阅读 · 0 评论 -
go 实现多人聊天系统需求和设计
一需求完成指定用户的登录。二图解三用户登录设计步骤和思路1 完成客户端发送消息长度,服务器端可以正常收到该长度值。确定消息 Message 的格式和结构。2 完成客户端可以发送消息本身,服务器端可以正常接收到消息,并根据客户端发送的消息(LoginMes), 判断用户的合法性,并返回相应的 LoginResMes。a 让客户端发送消息本身。b 服务器端接受到消息,然后反序列化成对应的消息结构体。c 服务器端根据反序列化后对应的消息,判断是登录用户是否合法,返...原创 2021-05-23 15:52:12 · 422 阅读 · 0 评论 -
go 实现多人聊天系统——显示客户端登录菜单
一 功能能够正确的显示客户端的菜单。二 界面三 代码package mainimport ( "fmt" "os")// 定义两个变量,一个表示用户 id, 一个表示用户密码var userId intvar userPwd stringfunc main() { // 接收用户的选择 var key int // 判断是否还继续显示菜单 // var loop = true for true { fmt.Prin原创 2021-05-17 17:45:51 · 277 阅读 · 1 评论 -
Golang 对 Redis 链接池操作
一点睛通过 Golang 对 Redis 操作, 可以通过 Redis 链接池来提升性能,流程如下。1 事先初始化一定数量的链接,放入到链接池。2 当 Go 需要操作 Redis 时, 直接从 Redis链接池取出链接即可。3 这样可以节省临时获取 Redis链接的时间,从而提高性能。二图解三代码package mainimport ( "fmt" "github.com/garyburd/redigo/redis")// 定义一个全局的...原创 2021-05-16 12:20:35 · 425 阅读 · 0 评论 -
Golang 对 Redis 的一些常用操作
一 批量 Set/Get 数据1 说明通过 Golang 对 Redis 操作,一次操作可以 Set/Get 多个 key-val 数据。2 代码package mainimport ( "fmt" "github.com/garyburd/redigo/redis" // 引入redis包)func main() { // 通过 go 向 redis 写入数据和读取数据 // 1 链接到 redis conn, err := redis.Dial(原创 2021-05-16 12:10:14 · 311 阅读 · 0 评论 -
Golang 操作 Redis 的 Hash
一需求对 hash 数据结构,要求 field-val 一个一个放入和读取。二 代码package mainimport ( "fmt" "github.com/garyburd/redigo/redis" // 引入redis包)func main() { // 通过go 向redis 写入数据和读取数据 // 1 链接到 redis conn, err := redis.Dial("tcp", "127.0.0.1:6379") if e.原创 2021-05-16 11:48:09 · 826 阅读 · 0 评论