文章分类 - Go 基础速学篇
摘要:一:自定义路由 有三个元素 1:request method :常见的有 Get/Post/Put/Delete 2:请求路径,如 / 3:http.HandlerFunc 于是我们定义一个二维的map map[string]map[string]http.HandlerFunc 用来保存上述3个元
阅读全文
摘要:一:路由分发器 二:练习:假设访问/ 一切ok,如果访问/admin 则需要登录(判断cookie中是否有username这一项) 2.1:先写登录的路由 package main import ( "net/http" ) type MyHandler struct { } func (*MyHa
阅读全文
摘要:引言:前几篇我们简单的学习了下Socket服务端以及客户端,并且模拟实现了一个浏览器的访问,并且上篇做了一个浏览器静态文件的读取,并输出到页面中; 我们发现处理http请求的整个原理其实并不难,但是如果要是把它实现的很完善并且封装,还是很复杂的;接下来的篇幅我们不打算一步步把httpserver演示
阅读全文
摘要:一:代码格式整理:先将服务端代码中响应浏览器的代码函数 拎出来放到服务端包中 二:代码 服务端代码: package main import ( "fmt" "net" "runtime" "time" ) func main() { lis,err:=net.Listen("tcp","127.0
阅读全文
摘要:引言:上篇我们对Socket服务端进行了一个死循环,不管客户端连接了多少次,都不会让我们的服务端停止,并且实现了浏览器的基本输出; 如果浏览器不支持响应,需要添加响应的http格式;那我们的浏览器就会正常的响应; 今天我们要做的内容是在上节课的基础上加上协程支持;并分析请求path; 首先在上篇浏览
阅读全文
摘要:一:引言 上篇我们写的程序,服务端并没有做任何的循环监听,一旦两者交互完成,那么服务端和客户端就会同时结束, 所以上篇服务端是一次性的服务端,今天我们将其改造为死循环,可以让我们的服务端一直监听客户端, 二:先简化并注释上篇服务端的代码 package main import ( "fmt" "ne
阅读全文
摘要:一:网络模型 二:Socket 创建服务端和客户端文件 三:服务端代码 package main import ( "fmt" "io" "net" ) func main() { lis,err:=net.Listen("tcp","127.0.0.1:8099") if err !=nil{ f
阅读全文
摘要:一:bufio很有用方法是ReadString/ReadBytes 输出结果: 由于协程是交替运行的,所以输出结果 不一定是按照我们的行号显示的 优化代码 按行读取
阅读全文
摘要:一:先看实例 1.1:单线程执行 1.2:开启两个协程 二:互斥锁入门 上节课我们学到了sync包,利用其waitgroup来实现等待协程执行结束 sync包里还有一个很有用的功能:锁 今天我们先学 sync.Mutex ,互斥锁,其中有两个函数 1、Lock() 上锁 2、Unlock() 解锁
阅读全文
摘要:一:上节课代码 上节课代码逻辑是:通过协程来抓取,抓取完成以后使用主线程来执行写入,如果抓取和写入放到一个协程里就不需要管道来通信了, 怎么来判断我们协程全部执行完成了?我们接下来来了解sync这个包 二:sync包 sync中文意思是:同步。后面我们还会用到此包 其中sync包有个很有用的功能Wa
阅读全文
摘要:上节课的例子中 运气好,三页都能抓下来。运气不好,只能抓1-2页 原因很简单,我们创建的协程并不是按顺序执行的 有可能先执行第三页 一:select select 很类似switch case .只不过用于channel通信(要么send要么receive) 譬如select { case i<-c
阅读全文
摘要:一:golang中抛出异常 (2)如何做到抛出panic异常以后,后面的代码可以继续执行 defer关键字:这时我们就要用defer 定义。 这很类似finally、也好比是析构函数。 (3)defer函数可以指定多个,后进先出,延迟执行,常用于销毁资源、释放句柄等 (4) :如果是在有返回值的函数
阅读全文
摘要:引言:其他课程里我们会讲到 go的网络编程,会用到net包,它提供了底层网络操作接口。 其中下面还有个net/http包,提供http层面的接口操作,使用它可以方便的创建http服务器。 一:多协程抓取网页 今天我们先简单 用它来下载一些网页,为了中立, 我们下载博客园的文章 看这个地址 https
阅读全文
摘要:一:交叉合并数组练习 users:="痞子胥,涅凡尘,凤白羽,方清雪" ages:="19,21,25,26" 这两个字符串,从顺序上看是一一对应的,需求是:拆分字符串成数组,交叉并合并成一个新的切片 提示:拆分字符串为数组:string.Split(users,",") 方法1:遍历插入 方法2:
阅读全文
摘要:引言: func sum(max int){ result:=0 for i:=1;i<=max;i++{ result=result+i } fmt.Println(result) } func main(){ go sum(100) /* 直接运行是没有输出的,因为main函数已经运行结束了,但
阅读全文
摘要:一:协程概念 协程的本质是将线程的调度权交给程序自己,而不是CPU,所以叫做用户态的轻量级线程; 最终执行任务的还是线程,线程是资源调度的基本单位,golang实现自己的协程调度机制, 叫goroutine,支持并行,比常规的协程更屌;
阅读全文
摘要:一:map字典 (1):map 类型定义:map[keyType]valType []里面放的是key的类型(2):初始化的方法 a:用make的方式 m:=make(map[string]string) m["username"]="痞子胥" m["userQq"]="123456" b:带值初始
阅读全文
摘要:引言:上一篇我们是返回一个UserModel切片,但是这个太有"针对性“,假设我们要做个数据库工具类,不可能都返回指定的Model, 这个时候我们要做一个通用的返回值 一:空接口了解下: type all interface{ } 任何类型都可以是空接口(因为它里面什么都"没有") var i al
阅读全文
摘要:引言:上一篇 我们遗留一个思考问题 如何把查询出来的数据 变成一个结构体数组? 但是有个问题:数组一旦定义好长度以后,是不能改变长度的,如果动态的把查询出来的数据组装成结构体数组是不能实现的 所以我们引入切片的概念 一:切片 切片追加元素使用append函数,这里面cap的理解可以粗略的理解为: 如
阅读全文
摘要:一:安装和使用 github 地址:https://github.com/go-sql-driver/mysql 安装:go get -u github.com/go-sql-driver/mysql import "database/sql" import _ "github.com/go-sql
阅读全文

浙公网安备 33010602011771号