![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go
文章平均质量分 75
Mango酱
这个作者很懒,什么都没留下…
展开
-
go语言实战-----32-----(网站)架构分析、要点分析、模块分析、前后端解耦---REST API设计,包括用户、视频、评论--- 数据库设计,包括用户、视频、评论、会话、待删除视频
go流媒体网站技术要点1)前后端分离的系统架构设计。2)RESTful风格API设计与实现。3)Go实现web服务。4)系统的服务化解耦。5)go的channel和并发模型的实践。6)使用go原生template完成web UI的实现。1 前后端分离的系统架构设计1.1 总体架构:1)客户端先发送请求到前端服务进行处理。2)前端服务收到请求后,直接转发或者包装一下请求,然后通过API接口层发送到后端的不同服务。3)API接口层,可以认为是一个中间层。负责转发、调度给不同的后端服务原创 2022-04-23 11:31:16 · 1057 阅读 · 0 评论 -
go语言实战-----31-----流媒体架构设计之直播架构、音视频通话(常见 流媒体协议 解释)
一 直播架构直播架构例如以某主播在某直播平台直播为例:1)首先向平台请求直播url。2)主播得到url。3)然后主播开始往该url推流,实际最终是推流至流媒体服务器。4)此时,当有用户观看时,即拉流,那么拉流成功。可能网页端还会有其它功能,例如主播直播相关信息等等业务。1 直播框架示例12 直播框架示例2-某直播学院框架3 直播架构-基本逻辑上面两个图主要是按业务功能来区分模块。而下面这幅图可能更倾向于按代码区分模块。4 常见流媒体协议1)RTP实时传输协议(Real原创 2022-04-21 22:15:46 · 5626 阅读 · 0 评论 -
go语言实战-----30-----token机制微信公众号签名验证的方法、XML解析,CDATA解析、交换协议、接收消息协议、被动回复消息协议、正则表达式
一 token机制微信公众号签名验证的方法1 token机制token机制就是使用一个token(通常是一个字符串,长度没有特别限制,一般是10字节或者16字节),然后按照一定的算法生成签名,然后对接的双方通过这个签名进行判断,相等则token认证成功,不相等则认证失败。下面将以微信公众号的token机制算法为例进行讲述。1.1 token算法微信公众号token的验证方法,实际在验证token时,不会直接验证token,而是验证由token生成的签名,因为直接验证token,就需要进行传输,这样原创 2022-04-19 21:44:20 · 1680 阅读 · 0 评论 -
go语言实战-----29-----公众号开发逻辑、注册、权限处理、消息回复
一 微信公众号开发逻辑下面按照以下几点进行讲解微信公众号开发逻辑。1)注册公众号。2)开发者权限。3)微信公众号后台接口权限。4)公众号消息回复。5)服务器配置。1 注册公众号注册地址: https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN&token=。选择订阅号。不过选择服务号应该也行,学习的话使用订阅号就行了。填写密码,然后选择中国大陆。然后它会提示让你再选择一次类型,原创 2022-04-17 15:32:20 · 951 阅读 · 0 评论 -
go语言实战-----28-----Gin、rest full api和mysql实现增删改查
一 Gin、rest full api和mysql实现增删改查gin_restful的项目目录。每个目录的意思描述:对gin_restful项目进行mod处理:# 1. 去到自己的gin_restful项目目录路径下。cd xxx\gin_restful\# 2. 如果之前以及mod init,可以删除这些文件。主要是go.mod、go.sum。rm go.*# 3. 进行mod初始化。# 注意:后面跟着的工程名gin_restful请设置成对应所在的根目录名字,否则在build时会报原创 2022-04-16 18:34:31 · 1480 阅读 · 0 评论 -
go语言实战-----27-----mysql增删改查、预处理、事务、第三方库sqlx
一 mysql增删改查Mysql准备工作首先我们建库建表,以方便进行测试。运行下面sql文件:CREATE DATABASE IF NOT EXISTS go_test;use go_test;CREATE TABLE `user` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`name` VARCHAR(20) DEFAULT '',`age` INT(11) DEFAULT '0',PRIMARY KEY(`id`))ENGINE=InnoDB原创 2022-04-13 22:14:22 · 1271 阅读 · 0 评论 -
go语言实战-----26-----简单Web模板
一 简单Web模板在http服务器使用简单Web模板可以方便我们快速进行web相关的开发。例如给多个用户进行邮件的发送,一些程序的报警信息等等,这时模板的便捷性就体下出来。package mainimport ( "fmt" "html/template" "net/http")// 全局的html模板变量var myTemplate *template.Templatetype Result struct { output string}// 实现Write方法,提供给i原创 2022-04-12 18:11:28 · 559 阅读 · 0 评论 -
go语言实战-----25-----HTTP编程get/post/head、表单处理、panic处理
一 HTTP编程get/post/head1 HTTP编程1) Go原生支持http,import(“net/http”)即可。2) Go的http服务性能和nginx比较接近。3) 几行代码就可以实现一个web服务。1.1 HTTP常见请求方法http常见请求方法:1)Get请求。2)Post请求。3)Put请求。4)Delete请求。5)Head请求。更详细点:HTTP/1.0定义了三种请求方法:GET、POST、和HEAD方法。HTTP/1.1新增了五种方法:OPTIO原创 2022-04-12 16:29:22 · 2801 阅读 · 0 评论 -
go语言基础-----24-----命令行解析Go flag、uuid唯一ID
一 命令行解析Go flag1. 定义flag参数的相关函数参数有三个:第一个为 参数名称,第二个为 默认值,第三个是 使用说明(1)通过 flag.String(),Bool(),Int() 等 flag.Xxx() 方法,该种方式返回一个相应的指针。var ip = flag.Int("flagname", 1234, "help message for flagname")(2)通过 flag.XxxVar() 方法将 flag 绑定到一个变量,该种方式返回 值类型。var flagva原创 2022-02-21 11:51:10 · 1568 阅读 · 1 评论 -
go语言基础-----23-----文件解析器goconfig
1 文件解析器goconfiggo的ini配置文件非常简单,看下面代码即可。运行之前需要go get。go get "github.com/Unknwon/goconfig"package mainimport ( "fmt" "log" "github.com/Unknwon/goconfig")func main() { // 1. 加载配置文件到内存。 cfg, err := goconfig.LoadConfigFile("./conf.ini") // 读取后文件关原创 2022-02-20 18:42:46 · 1099 阅读 · 0 评论 -
go语言基础-----22-----对象池使用
1 临时对象池1、 sync.Pool类型值作为存放临时值的容器。此类容器是自动伸缩的,高效的,同时也是并发安全的。2、sync.Pool类型只有两个方法:◼ Put,用于在当前的池中存放临时对象,它接受一个空接口类型的值。◼ Get,用于从当前的池中获取临时对象,它返回一个空接口类型的值。3、New字段:sync.Pool类型的New字段是一个创建临时对象的函数。它的类型是没有参数但是会返回一个空接口类型的函数。即:func() interface{}。这个函数是Get方法最后原创 2022-02-20 18:32:47 · 802 阅读 · 0 评论 -
go语言基础-----21-----redis中间件、增删改查
1 连接redis连接redis的时候,需要注意下面几点:1)因为使用的是go语言,用到了redigo,所以首先需要在命令行go get对应的包。go get成功时没有任何输出。go get "github.com/gomodule/redigo/redis"2)在调用redis.Dial(“tcp”, “192.168.1.9:6379”)连接时,因为我的redis配置文件(redis.conf)的bind默认是127.0.0.1,导致代码填192.168.1.9时,会如下报错:con原创 2022-02-20 14:23:54 · 1226 阅读 · 1 评论 -
go语言基础-----20-----TCP网络编程
1 网络编程介绍目前主流服务器一般均采用的都是”Non-Block + I/O多路复用”(有的也结合了多线程、多进程)。不过I/O多路复用也给使用者带来了不小的复杂度,以至于后续出现了许多高性能的I/O多路复用框架, 比如libevent、libev、libuv等,以帮助开发者简化开发复杂性,降低心智负担。不过Go的设计者似乎认为I/O多路复用的这种通过回调机制割裂控制流 的方式依旧复杂,且有悖于“一般逻辑”设计,为此Go语言将该“复杂性”隐藏在Runtime中了:Go开发者无需关注socket是否是原创 2022-02-13 22:01:54 · 2957 阅读 · 0 评论 -
go语言基础-----19-----Context使用原则、接口、派生上下文(select的多路复用可以参考这里理解更好)
1 Go语言Context介绍为什么需要 Context ?每一个处理都应该有个超时限制。需要在调用中传递这个超时。比如开始处理请求的时候我们说是 3 秒钟超时。那么在函数调用中间,这个超时还剩多少时间了?需要在什么地方存储这个信息,这样请求处理中间可以停止。Context是协程安全的。代码中可以将单个Context传递给任意数量的goroutine,并在取消该Context时可以将信号传递给所有的goroutine。2 Context接口Context接口的文件位置位于go/src/原创 2022-02-12 17:58:17 · 765 阅读 · 0 评论 -
go语言基础-----18-----协程安全、互斥锁、读写锁、匿名锁、sync.Once
1 线程安全-互斥锁竞态检查工具是基于运行时代码检查,而不是通过代码静态分析来完成的,可以添加-race 来执行竞态检测。但是对于那些没有机会运行到的代码逻辑中如果存在安全隐患,即使加了-race,它也是检查不出来的。例如下面例子,多个协程不加锁的情况下,对map进行读写操作,必定会报竞态错误,不过需要加上-race,否则看不到对应的错误。想要解决竞态错误很简单,自己添加一把互斥锁即可。PS:-race只能在运行时触发,在启用情况下其CPU和内存通常是正常程序的5~10倍,故生产环境不宜使用。如果原创 2022-02-11 17:32:57 · 3195 阅读 · 0 评论 -
go语言基础-----17-----channel创建、读写、安全关闭、多路复用select
1 通道channel介绍1)channel,可译为通道,是go语言协程goroutine之间的通信方式。2)channel通信可以想象成从管道的一头塞进数据,从另一头读取数据。通道作为容器是有限定大小的,满了就写不进去,空了就读不出来。3)channel是拥有数据类型的,channel只能传递指定的数据类型的值。4)多协程操作时(即多个写多个读),它是协程安全的,不需要额外加锁。2 创建通道创建通道只有一种语法,使用make 函数。创建的通道有两种通道类型:1)缓冲型通道。//语原创 2022-02-11 09:35:04 · 3946 阅读 · 0 评论 -
go语言基础-----16-----goroutine、GPM模型
1 如何使用Goroutine在函数或方法调用前面加上关键字go,您将会同时运行一个新的Goroutine。例如:// hi为一个函数go hi()2 子协程异常退出的影响在使用子协程时一定要特别注意保护好每个子协程,确保它们正常安全的运行。因为子协程的异常退出会将异常传播到主协程,直接会导致主协程也跟着挂掉,然后整个程序就崩溃了。例如:package mainimport ( "fmt" "time")func main() { fmt.Println("run in ma原创 2022-02-10 11:29:09 · 697 阅读 · 0 评论 -
go语言基础-----15-----反射
1 reflect反射1)反射定义:在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。2)GO 反射的意义:Go 语言的 ORM 库离不开它,Go 语言的 json 序列化库离不开它, fmt包字符串格式化离不开它,Go 语言的运行时更是离不开它。3)反射的目标:获取变量的类型信息,例如这个类型的名称、占用字节数、所有的方法列表、所有的内部字段结构、它原创 2022-02-03 13:24:28 · 1000 阅读 · 0 评论 -
go语言基础-----14-----GoTest
1 前置条件:1、文件名须以"_test.go"结尾。2、方法名须以"Test"打头,并且形参为 (t *testing.T)。2 举例gotest.go(这个只是测试文件用到的内部文件,所以不用_test.go结尾):package mytestimport ( "errors")func Division(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("除数不能为原创 2022-02-01 15:20:08 · 368 阅读 · 0 评论 -
go语言基础-----13-----文件
1 文件分类和为什么需要文件1.1 文件分类和为什么需要文件1)设备文件:屏幕(标准输出设备) fmt.Println() 从标准输出设备写内容。键盘(标准输入设备) fmt.Scan() 从标准输入设备读取内容。2)磁盘文件,放在存储设备上的文件:1、文本文件 以记事本打开,能看到内容(不是乱码)。2、二进制文件 以记事本打开 ,能看到内容(是乱码)。3)为什么需要文件?1、内存掉电丢失,程序结束,内存中的内容消失。2、文件放磁盘,程序结束,文件还是存在。2原创 2022-01-31 16:53:42 · 134 阅读 · 0 评论 -
go语言基础-----12-----json
1 json介绍JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成。尽管JSON是JavaScript的一个子集,但JSON采用完全独立于编程语言的文本格式,且表现为键/值对集合的文本描述形式(类似一些编程语言中的字典结构),这使它成为较为理想的、跨平台、跨语言的数据交换语言。例如:{ "company": "itcast", "subjects": [ "Go",原创 2022-01-31 12:51:43 · 834 阅读 · 0 评论 -
go语言基础-----11-----正则表达式
1 正则表达式介绍正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活。按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合。Go语言通过regexp标准包为正则表达式提供了官方支持,如果你已经使用过其他编程语言提供的正则相关功能,那么你应该对Go语言版本的不会太陌生,但是它们之间也有一些小的差异,因为Go实现的是RE2标准,除了\C,详细的语法描述参考:http://code.google.com/p/r原创 2022-01-30 22:01:27 · 458 阅读 · 0 评论 -
go语言基础-----10-----字符串的相关操作(操作函数、字符串转换)
1 字符串操作的常用函数1、Containsfunc Contains(s, substr string) bool功能:字符串s中是否包含substr,返回bool值2、Joinfunc Join(a []string, sep string) string功能:字符串链接,把slice a通过sep链接起来 3、Indexfunc Index(s, sep string) int功能:在字符串s中查找sep所在的位置,返回位置值,找不到返回-14、Repeatfunc Rep原创 2022-01-30 20:09:41 · 170 阅读 · 0 评论 -
go语言基础-----09-----异常处理(error、panic、recover)
1 error1.1 error的相关介绍error一般是处理一些比较低级的错误,不会造成程序中断或者宕机。下面是go源码中error的相关内容:// 接口定义type error interface{ Error() string}package errors// 错误的结构体定义type errorString struct{ text string}// 该errorString结构体的方法的实现func (e *errorString)Error() string{原创 2022-01-30 19:05:03 · 1668 阅读 · 0 评论 -
go语言基础-----08-----接口
1 接口类型介绍接口是一种抽象的类型,它不会暴露出它所代表的对象的内布值的结构和这个对象所支持的基础操作的几乎,它只会展示出它们自己的方法,因为接口类型不能将其实例化。2 接口的定义和实现1)接口名字一般以er结尾命名,例如Windowser。2)接口只有方法的声明,没有实现,没有数据字段。3)接口可以匿名嵌入其它接口,或嵌入到结构中。package mainimport "fmt"// 接口的定义type Humaner interface { // 方法,只有声明,没有实现,原创 2022-01-30 13:24:19 · 754 阅读 · 0 评论 -
go语言基础-----07-----方法
1 方法的介绍1)方法的概念:简单说就是一个对象里面的函数,称为方法。2)在go语言中,可以给任意自定义类型(包括内置类型,但不包括指针类型)添加相应的方法。3)方法总是绑定对象实例,并隐式将实例作为第一参数。4)方法的语法:func (receiver receiverType) funcName(parameters) (results)// 1. receiver 为任意名字。// 2. receiverType为调用者的类型。可以是T或者*T。注意T本身不能是接口或者指针。例如T原创 2022-01-29 22:07:49 · 1395 阅读 · 0 评论 -
go语言基础-----06-----匿名字段、同名字段
一 匿名字段、同名字段1 匿名字段的作用及其初始化1)go中的匿名字段就是只有类型,没有名字。2)匿名字段的作用:因为go没有封装、继承、多态的概念,但是go也是可以面向对象编程,因为有匿名字段。例如下面,Student通过匿名字段继承了Persion的所有成员。实际上学过C的都知道,就是一个简单的结构体嵌套而已,只不过在go叫得高大尚了。type Persion struct { name string sex byte age int}// 普通变量的声明有var关键字,结构体原创 2022-01-29 15:24:52 · 1965 阅读 · 0 评论 -
go语言基础-----05-----结构体
一 结构体的相关学习go语言的结构体学习起来是比较简单的,下面按照顺序去看即可。package mainimport "fmt"// 普通变量的声明有var关键字,结构体内部不需要vartype Student struct { id int name string sex byte age int addr string}func main(){ // 1. 结构体的初始化 // 1.1 结构体普通变量初始化 // 1)顺序初始化,每个成员必须赋值 var s1原创 2022-01-29 10:31:43 · 626 阅读 · 0 评论 -
go语言基础-----04-----闭包、数组切片、map、package
一 闭包、数组切片、map、package1 内置函数close:主要用来关闭channel。len:用来求长度,比如string、array、slice、map、channel。new:用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针。make:用来分配内存,主要用来分配引用类型,比如chan、map、slice。append:用来追加元素到数组、slice中。panic和recover:用来做错误处理。new和make的区别。1)简单来说,new就是开辟内存返原创 2022-01-26 12:58:14 · 1012 阅读 · 0 评论 -
go语言基础-----03-----流程控制、函数、值传递、引用传递、defer函数
1 流程控制这里只讲"for range 语句"这个关键字,主要用于遍历,用来遍历数组、slice、map、chan。例如:package mainimport ( "fmt")func main() { str := "hello world,中国" for i, v := range str { fmt.Printf("index[%d] val[%c]\n", i, v) }}2 函数函数实际上在上一节也有提过。2.1. 声明语法:func 函数名 (参数列表)原创 2022-01-20 23:02:01 · 161 阅读 · 0 评论 -
go语言基础-----02-----基本数据类型和操作符
一 基本数据类型和操作符文件名&关键字&标识符。Go程序基本结构。常量和变量。数据类型和操作符。字符串类型。1.1文件名&关键字&标识符所有go源码以.go结尾。标识符以字母或下划线开头,不能以数字开头,大小写敏感。_是特殊标识符叫匿名变量,用来忽略结果,表示舍弃该值,一般配合函数返回值才有优势。保留关键字。下面对部分常用的关键字进行解释:1) ◼ var和const :变量和常量的声明。例如变量的定义,var varName type原创 2022-01-20 20:40:53 · 675 阅读 · 0 评论 -
go语言基础-----01-----go语言特性
一 go语言特性1.1 开发环境搭建实际上就是安装go环境与GoLand IDE工具。go语言环境:go语言环境下载地址。GoLand IDE工具:GoLand IDE工具下载地址。不过这个想要破解版需要一个压缩包。1.2.1 Go语言特性-垃圾回收a. 内存自动回收,再也不需要开发人员管理内存。b. 开发人员专注业务实现,降低了心智负担。c. 只需要new分配内存,不需要释放。d. gc 垃圾回收 4ms。1.2.2 Go语言特性-天然并发a. 从语言层面支持并发,非常简单。原创 2022-01-18 22:38:29 · 654 阅读 · 0 评论