十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识。
博爱ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的操作等的类型和函数。
在本教程中,您将创建一个数据库,然后编写代码来访问该数据库。您的示例项目将是有关老式爵士乐唱片的数据存储库。
首先,为您要编写的代码创建一个文件夹。
1、打开命令提示符并切换到您的主目录。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,为您的代码创建一个名为 data-access 的目录。
3、创建一个模块,您可以在其中管理将在本教程中添加的依赖项。
运行go mod init命令,为其提供新代码的模块路径。
此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪。
注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径。有关更多信息,请参阅一下文章。
GO语言(二十五):管理依赖项(上)
GO语言(二十六):管理依赖项(中)
GO语言(二十七):管理依赖项(下)
接下来,您将创建一个数据库。
在此步骤中,您将创建要使用的数据库。您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据。
您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据。
这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能。
1、打开一个新的命令提示符。
在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示。
2、在mysql命令提示符下,创建一个数据库。
3、切到您刚刚创建的数据库,以便您可以添加表。
4、在文本编辑器的 data-access 文件夹中,创建一个名为 create-tables.sql 的文件来保存用于添加表的 SQL 脚本。
将以下 SQL 代码粘贴到文件中,然后保存文件。
在此 SQL 代码中:
(1)删除名为album表。 首先执行此命令可以让您更轻松地稍后重新运行脚本。
(2)创建一个album包含四列的表:title、artist和price。每行的id值由 DBMS 自动创建。
(3)添加带有值的四行。
5、在mysql命令提示符下,运行您刚刚创建的脚本。
您将使用以下形式的source命令:
6、在 DBMS 命令提示符处,使用SELECT语句来验证您是否已成功创建包含数据的表。
接下来,您将编写一些 Go 代码进行连接,以便进行查询。
现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码。
找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求。
1、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序。
2、使用页面上的列表来识别您将使用的驱动程序。为了在本教程中访问 MySQL,您将使用 Go-MySQL-Driver。
3、请注意驱动程序的包名称 - 此处为github.com/go-sql-driver/mysql.
4、使用您的文本编辑器,创建一个用于编写 Go 代码的文件,并将该文件作为 main.go 保存在您之前创建的数据访问目录中。
5、进入main.go,粘贴以下代码导入驱动包。
在此代码中:
(1)将您的代码添加到main包中,以便您可以独立执行它。
(2)导入 MySQL 驱动程序github.com/go-sql-driver/mysql。
导入驱动程序后,您将开始编写代码以访问数据库。
现在编写一些 Go 代码,让您使用数据库句柄访问数据库。
您将使用指向结构的指针sql.DB,它表示对特定数据库的访问。
编写代码
1、进入 main.go,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄。
在此代码中:
(3)使用 MySQL 驱动程序Config和FormatDSN类型以收集连接属性并将它们格式化为连接字符串的 DSN。
该Config结构使代码比连接字符串更容易阅读。
(4)调用sql.Open 初始化db变量,传递 FormatDSN。
(5)检查来自 的错误sql.Open。例如,如果您的数据库连接细节格式不正确,它可能会失败。
为了简化代码,您调用log.Fatal结束执行并将错误打印到控制台。在生产代码中,您会希望以更优雅的方式处理错误。
(6)调用DB.Ping以确认连接到数据库有效。在运行时, sql.Open可能不会立即连接,具体取决于驱动程序。您在Ping此处使用以确认 database/sql包可以在需要时连接。
(7)检查来自Ping的错误,以防连接失败。
(8)Ping如果连接成功,则打印一条消息。
文件的顶部现在应该如下所示:
3、保存 main.go。
1、开始跟踪 MySQL 驱动程序模块作为依赖项。
使用go get 添加 github.com/go-sql-driver/mysql 模块作为您自己模块的依赖项。使用点参数表示“获取当前目录中代码的依赖项”。
2、在命令提示符下,设置Go 程序使用的DBUSER和DBPASS环境变量。
在 Linux 或 Mac 上:
在 Windows 上:
3、在包含 main.go 的目录中的命令行中,通过键入go run来运行代码。
连接成功了!
接下来,您将查询一些数据。
原曲:东方幻想乡/BadApple!! Vocal:nomico サークル:AlstroemeriaRecords 社团:AlstroemeriaRecords アルバム:Lovelight 专辑:Lovelight Arranger:MasayoshiMinoshima na ga re te ku to ki no na ka de de mo ke da ru sa ga ho ra gu ru gu ru ma wa tte ながれてく ときのなかででも けだるさが ほらグルグルまわって 流 れてく 时 の中 ででも 气だるさが ほらグルグル回 って 就算在流逝的时间中仍能发现 你瞧,只在原地打转不停 wa da si ka ra ha na re ni ko ko ro mo mi e na i wa so u si ra na i わたしから はなれにこころも みえないわ そうしらない? 私 から 离 れに心 も 见えないわ そう知らない? 我那已失去的心也看不见 你能明白吗? ji bu n ka ra u go ku ko to mo na ku to ki no su ki ma ni na ga sa re tu du ke te じぶんから うごくこともなく ときのすきまに ながされつづけて 自分 から 动 く事 もなく 时 の隙 间に 流 され续 けて 就算自己什么都不做 时光仍渐渐消逝在缝隙中 si ra na i wa ma wa ri no ko ro na do wa da si wa wa da si so re da ke しらないわ まわりのことなど わたしはわたし それだけ 知らないわ 周 りの事 など 私 は私 それだけ 周遭的一切我一概不知 “我就是我” 所知的仅此而已 yu me mi te ru na ni mo ni te na i ka ta ru mo mu da na ji fu n no ko to ba ゆめみてる? なにもみてない? かたるもむだな じぶんのことば? 梦 见てる? 何 も见てない? 语 るも无驮な 自分 の言 叶? 在梦中发现了吗? 还是什么都没发现? 发现自己如何诉说也没用的真心话? ka na si mu na n te tu ka re ru da ke yo na ni mo ka n ji zu su go se ba i i no かなしむなんて つかれるだけよ なにもかんじず すごせばいいの 悲 しむなんて 疲 れるだけよ 何 も感 じず 过ごせばいいの 悲伤只会使自己更累 干脆什么都别多想 如此度日就好 to ma do u ko to ba a ta e ra re te mo ji fu n no ko ko ro ta da u e no so ra とまどうことば あたえられても じふんのこころ ただうえのそら 户惑 う言 叶 与 えられても 自分 の心 ただ上 の空 就算听到令人困惑的话语 我的心早已悬在半空 mo si wa da si ka ra u go ku no na ra ba su be te ka e ru no na ra ku ro ni su ru もしわたしから うごくのならば すべてかえるのなら くろにする もし私 から 动 くのならば すべて变えるのなら 黑 にする 若我试着改变这一切的话 这一切都将化为黑暗 ko n na ji fu n ni mi ra i wa a ru no ko n na se ka i ni wa da si wa i ru no こんなじふんに みらいはあるの? こんなせかいに わたしはいるの? こんな自分 に 未来 はあるの? こんな世界 に 私 はいるの? 这样的我能有未来吗? 这样的世界能有我吗? i ma se tu na i no i ma ka na si i no ji fu n no ko to mo wa ka ra na i ma ma いませつないの? いまかなしいの? じふんのことも わからないまま 今 切 ないの? 今 悲 しいの? 自分 の事 も わからないまま 现在我很难过吗? 现在我很悲伤吗? 就像这样连自己的事都不清楚 a yu mu ko to sa e tu ka re ru da ke yo hi to no ko to na do si ri mo si na i wa あゆむことさえ つかれるだけよ ひとのことなど しりもしないわ 步 む事 さえ 疲 れるだけよ 人 の事 など 知りもしないわ 就算继续走下去也只会感到更累 人际关系什么的 干脆也别去了解了 ko n na wa da si mo ka wa re ru mo na ra mo si ka wa re ru no na ra si ro ni na ru こんなわたしも かわれるもなら もしかわれるのなら しろになる? こんな私 も 变われるもなら もし变われるのなら 白 になる? 这样的我也能改变吗 如果真的改变的话 一切能回归虚无吗? na ga re te ku to ki no na ka de de mo ki da ru sa ga ho ra gu ru gu ru ma tte ながれてく ときのなかででも きだるさが ほらグルグルまって 流 れてく 时 の中 ででも 气だるさが ほらグルグル回って 就算在流逝的时间中仍能发现 你瞧,只在原地打转不停 wa da si ka ra ha na re ni ko ko ro mo mi e na i wa so u si ra na i わたしから はなれにこころも みえないわ そうしらない? 私 から 离 れに心 も 见えないわ そう知らない? 我那已失去的心也看不见 你能明白吗? ji fu n ka ra u go ku ko to mo na ku to ki no su ki ma ni na ga sa re tu du ke te じふんから うごくこともなく ときのすきまに ながされつづけて 自分 から 动 く事 もなく 时 の隙 间に 流 され续 けて 就算自己什么都不做 时光仍渐渐消逝在缝隙中 si ra na i wa ma wa ri no ko ro na do wa da si wa wa da si so re da ke しらないわ まわりのことなど わたしはわたし それだけ 知らないわ 周 りの事 など 私 は私 それだけ 周遭的一切我一概不知 “我就是我” 所知的仅此而已 yu me mi te ru na ni mo ni te na i ka ta ru mo mu da na ji fu n no ko to ba ゆめみてる? なにもみてない? かたるもむだな じふんのことば? 梦 见てる? 何 も见てない? 语 るも无驮な 自分 の言 叶? 在梦中发现了吗? 还是什么都没发现? 发现自己如何诉说也没用的真心话? ka na si mu na n te tu ka re ru da ke yo na ni mo ka n ji zu su go se ba i i no かなしむなんて つかれるだけよ なにもかんじず すごせばいいの 悲 しむなんて 疲 れるだけよ 何 も感 じず 过ごせばいいの 悲伤只会使自己更累 干脆什么都别多想 如此度日就好 to ma do u ko to ba a ta e ra re te mo ji fu n no ko ko ro ta da u e no so ra とまどうことば あたえられても じぶんのこころ ただうえのそら 户惑 う言 叶 与 えられても 自分 の心 ただ上 の空 就算听到令人困惑的话语 我的心早已悬在半空 mo si wa da si ka ra u go ku no na ra ba su be te ka e ru no na ra ku ro ni su ru もしわたしから うごくのならば すべてかえるのなら くろにする もし私 から 动 くのならば すべて变えるのなら 黑 にする 若我试着改变这一切的话 这一切就将化为黑暗 mu da na ji ka n ni mi ra i wa a ru no ko n na to ko ro ni wa da si wa i ru no むだなじかんに みらいはあるの? こんなところに わたしはいるの? 无驮な时间 に 未来 はあるの? こんな所 に 私 はいるの? 蹉跎的时光中还能拥有未来吗? 这样的地方还能让我存在吗? wa da si no ko to wo i i ta i na ra ba ko to ba ni su ru no na ra ro ku de na si わたしのことを いいたいならば ことばにするのなら “ろくでなし” 私 の事 を 言いたいならば 言 叶にするのなら “ろくでなし” 如果想要描述我这个人的话 以语言表达就是个“没用的废人” ko n na to ko ro ni wa da si wa i ru no ko n na ji ka n ni wa da si wa i ru no こんなところに わたしはいるの? こんなじかんに わたしはいるの? こんな所 に 私 はいるの? こんな时间 に 私 はいるの? 我能在这样的地方吗? 这样的时间能有我吗? ko n na wa da si mo ka wa re ru mo na ra mo si ka wa re ru no na ra si ro ni na ru こんなわたしも かわれるもなら もしかわれるのなら しろになる? こんな私 も 变われるもなら もし变われるのなら 白 になる? 这样的我也能改变吗 如果真的改变的话 一切能回归虚无吗? i ma yu me ni te ru na ni mo mi te na i ka ta ru mo mu da na ji fu n no ko to ba いまゆめみてる? なにもみてない? かたるもむだな じぶんのことば? 今 梦 见てる? 何 も见てない? 语 るも无驮な 自分 の言 叶? 今天在梦中发现了吗? 还是什么都没发现? 发现自己如何诉说也没用的真心话? ka na si mu na n te tu ka re ru da ke yo na ni mo ka n ji zu su go se ba i i no かなしむなんて つかれるだけよ なにもかんじず すごせばいいの 悲 しむなんて 疲 れるだけよ 何 も感 じず 过ごせばいいの 悲伤只会使自己更累 干脆什么都别多想 如此度日就好 to ma do u ko to ba a ta e ra re te mo ji fu n mo ko ko ro ta da u e no so ra とまどうことば あたえられても じぶんのこころ ただうえのそら 户惑 う言 叶 与 えられても 自分 の心 ただ上 の空 就算听到令人困惑的话语 我的心早已悬在半空 mo si wa da si ka ra u go ku no na ra ba su be te ka e ru no na ra ku ro ni su ru もしわたしから うごくのならば すべてかえるのなら くろにする もし私 から 动 くのならば すべて变えるのなら 黑 にする 若我试着改变这一切的话 这一切就将化为黑暗 u go ku no na ra ba u go ku no na ra ba su be te ko wa su wa su be te ko wa su wa うごくのならば うごくのならば すべてこわすわ すべてこわすわ 动 くのならば 动 くのならば すべて坏 すわ すべて坏 すわ 想要行动的话 想要改变的话 一切都会毁坏 一切都会崩溃 ka na si mu na ra ba ka na si mu na ra ba wa da si no ko ko ro si ro ku ka wa re ru かなしむならば かなしむならば わたしのこころ しろくかわれる? 悲 しむならば 悲 しむならば 私 の心 白 く变われる? 如果我感到伤心 如果我感到悲哀 我的心是否就能回归虚无呢? a na da no ko to mo wa da si no ko to mo su be te no ko to mo ma da si ra na i no あなたのことも わたしのことも すべてのことも まだしらないの 贵 方の事 も 私 の事 も 全 ての事 も まだ知らないの 不管是你的一切 或是我的一切 甚至是所有的一切 我还完全不清楚 o mo i me fu ta wo a ke ta no na ra ba su be te ko wa su no na ra ku ro ni na re おもいめふたを あけたのならば すべてこわすのなら くろになれ!! 重 い目盖 を 开けたのならば すべて坏 すのなら 黑 になれ!! 想张开这沉重的眼睛的话 想毁灭一切的话 就让黑暗吞噬掉这一切!! 曲谱 第一个:23456 2'1'62 6543 23456 54 3234 322b2323456 2'1'62 6543 23456 54 345623456 2'1'62 6543 23456 54 3234 322b2323456 2'1'62 6543 23456 54 34561'2'656 561'2'65656 654312 123456261'2'656 561'2'65656 654312 12345625 61'2'656 561'2'65656 654312 123456261'2'656 561'2'6562`3`4`3`2`1`6 565431261'2'656 561'2'65656 654312 123456261'2'656 561'2'65656 654312 123456261'2'656 561'2'65656 654312 123456261'2'656 561'2'6562`3`4`3`2`1`6 5654312 第二个:671'2'3' 6'5'3' 6 3'2'1'7 671'2'3' 2'1'7671'76(5#)7 671'2'3' 6'5'3' 6 3'2'1'7 671'2'3' 2'1'7 1' 2' 3' 671'2'3' 6'5'3' 6 3'2'1'7 671'2'3' 2'1'7671'76(5#)7 671'2'3' 6'5'3' 6 3'2'1'7 671'2'3' 2'1'7 1' 2' 3' 5'6'3'2'3' 2'3'5'6'3'2'3' 2'3' 2'1'756 5671'2'3'6 3'5' 5'6'3'2'3' 2'3'5'6'3'2'3' 2'3' 2'1'756 5671'2'3'6 3'5' 5'6'3'2'3' 2'3'5'6'3'2'3' 2'3' 2'1'756 5671'2'3'6 3'5' 5'6'3'2'3' 2'3'5'6'3'2'3' 6'7' 1''7'6'5'3' 2'3'2'1'756 3'5' 5'6'3'2'3' 2'3'5'6'3'2'3' 2'3' 2'1'756 5671'2'3'6 3'5' 5'6'3'2'3' 2'3'5'6'3'2'3' 2'3' 2'1'756 5671'2'3'6 3'5' 5'6'3'2'3' 2'3'5'6'3'2'3' 2'3' 2'1'756 5671'2'3'6 3'5' 5'6'3'2'3' 2'3'5'6'3'2'3' 6'7' 1''7'6'5'3' 2'3'2'1'756
网关=反向代理+负载均衡+各种策略,技术实现也有多种多样,有基于 nginx 使用 lua 的实现,比如 openresty、kong;也有基于 zuul 的通用网关;还有就是 golang 的网关,比如 tyk。
这篇文章主要是讲如何基于 golang 实现一个简单的网关。
转自: troy.wang/docs/golang/posts/golang-gateway/
整理:go语言钟文文档:
启动两个后端 web 服务(代码)
这里使用命令行工具进行测试
具体代码
直接使用基础库 httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy对象实现了serveHttp方法,因此可以直接作为 handler。
具体代码
director中定义回调函数,入参为*http.Request,决定如何构造向后端的请求,比如 host 是否向后传递,是否进行 url 重写,对于 header 的处理,后端 target 的选择等,都可以在这里完成。
director在这里具体做了:
modifyResponse中定义回调函数,入参为*http.Response,用于修改响应的信息,比如响应的 Body,响应的 Header 等信息。
最终依旧是返回一个ReverseProxy,然后将这个对象作为 handler 传入即可。
参考 2.2 中的NewSingleHostReverseProxy,只需要实现一个类似的、支持多 targets 的方法即可,具体实现见后面。
作为一个网关服务,在上面 2.3 的基础上,需要支持必要的负载均衡策略,比如:
随便 random 一个整数作为索引,然后取对应的地址即可,实现比较简单。
具体代码
使用curIndex进行累加计数,一旦超过 rss 数组的长度,则重置。
具体代码
轮询带权重,如果使用计数递减的方式,如果权重是5,1,1那么后端 rs 依次为a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端会瞬间压力过大;参考 nginx 内部的加权轮询,或者应该称之为平滑加权轮询,思路是:
后端真实节点包含三个权重:
操作步骤:
具体代码
一致性 hash 算法,主要是用于分布式 cache 热点/命中问题;这里用于基于某 key 的 hash 值,路由到固定后端,但是只能是基本满足流量绑定,一旦后端目标节点故障,会自动平移到环上最近的那么个节点。
实现:
具体代码
每一种不同的负载均衡算法,只需要实现添加以及获取的接口即可。
然后使用工厂方法,根据传入的参数,决定使用哪种负载均衡策略。
具体代码
作为网关,中间件必不可少,这类包括请求响应的模式,一般称作洋葱模式,每一层都是中间件,一层层进去,然后一层层出来。
中间件的实现一般有两种,一种是使用数组,然后配合 index 计数;一种是链式调用。
具体代码
记住密码 是用js cookie 但是你不要后台验证么 前台每个页面都读取cookie 来判断登陆状态 wow 能实现 但是没有实际意义
本文介绍一些Go语言的基础语法。
先来看一个简单的go语言代码:
go语言的注释方法:
代码执行结果:
下面来进一步介绍go的基础语法。
go语言中格式化输出可以使用 fmt 和 log 这两个标准库,
常用方法:
示例代码:
执行结果:
更多格式化方法可以访问中的fmt包。
log包实现了简单的日志服务,也提供了一些格式化输出的方法。
执行结果:
下面来介绍一下go的数据类型
下表列出了go语言的数据类型:
int、float、bool、string、数组和struct属于值类型,这些类型的变量直接指向存在内存中的值;slice、map、chan、pointer等是引用类型,存储的是一个地址,这个地址存储最终的值。
常量是在程序编译时就确定下来的值,程序运行时无法改变。
执行结果:
执行结果:
Go 语言的运算符主要包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符以及指针相关运算符。
算术运算符:
关系运算符:
逻辑运算符:
位运算符:
赋值运算符:
指针相关运算符:
下面介绍一下go语言中的if语句和switch语句。另外还有一种控制语句叫select语句,通常与通道联用,这里不做介绍。
if语法格式如下:
if ... else :
else if:
示例代码:
语法格式:
另外,添加 fallthrough 会强制执行后面的 case 语句,不管下一条case语句是否为true。
示例代码:
执行结果:
下面介绍几种循环语句:
执行结果:
执行结果:
也可以通过标记退出循环:
--THE END--
队列的概念在 顺序队列 中,而使用循环队列的目的主要是规避假溢出造成的空间浪费,在使用循环队列处理假溢出时,主要有三种解决方案
本文提供后两种解决方案。
顺序队和循环队列是一种特殊的线性表,与顺序栈类似,都是使用一组地址连续的存储单元依次存放自队头到队尾的数据元素,同时附设队头(front)和队尾(rear)两个指针,但我们要明白一点,这个指针并不是指针变量,而是用来表示数组当中元素下标的位置。
本文使用切片来完成的循环队列,由于一开始使用三个参数的make关键字创建切片,在输出的结果中不包含nil值(看起来很舒服),而且在验证的过程中发现使用append()函数时切片内置的cap会发生变化,在消除了种种障碍后得到了一个四不像的循环队列,即设置的指针是顺序队列的指针,但实际上进行的操作是顺序队列的操作。最后是对make()函数和append()函数的一些使用体验和小结,队列的应用放在链队好了。
官方描述(片段)
即切片是一个抽象层,底层是对数组的引用。
当我们使用
构建出来的切片的每个位置的值都被赋为interface类型的初始值nil,但是nil值也是有大小的。
而使用
来进行初始化时,虽然生成的切片中不包含nil值,但是无法通过设置的指针变量来完成入队和出队的操作,只能使用append()函数来进行操作
在go语言中,切片是一片连续的内存空间加上长度与容量的标识,比数组更为常用。使用 append 关键字向切片中追加元素也是常见的切片操作
正是基于此,在使用go语言完成循环队列时,首先想到的就是使用make(type, len, cap)关键字方式完成切片初始化,然后使用append()函数来操作该切片,但这一方式出现了很多问题。在使用append()函数时,切片的cap可能会发生变化,用不好就会发生扩容或收缩。最终造成的结果是一个四不像的结果,入队和出队操作变得与指针变量无关,失去了作为循环队列的意义,用在顺序队列还算合适。
参考博客:
Go语言中的Nil
Golang之nil
Go 语言设计与实现