Go
文章平均质量分 57
剩下的盛夏~
同济大学硕士在读
展开
-
Golang 中高级工程师学习笔记
闭包(Closure)是一种函数值,它可以引用在其外部定义的变量。闭包允许这些变量保持在函数内部,而不是被每次调用时重新创建。闭包的作用主要体现在以下几个方面。原创 2024-01-20 23:52:42 · 584 阅读 · 0 评论 -
ubuntu一键安装docker
ubuntu安装dockercurl -sSL https://get.daocloud.io/docker | sh原创 2021-11-09 10:28:39 · 1144 阅读 · 0 评论 -
狂神Docker基础笔记,全网最全!
课程链接官方文档仓库地址Docker安装与卸载安装#1.卸载旧版本yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \原创 2021-08-06 17:55:19 · 374 阅读 · 0 评论 -
Go协程超时退出的三种方式
主要介绍如何实现超时控制,主要有三种1、context.WithTimeout/context.WithDeadline + time.After2、context.WithTimeout/context.WithDeadline + time.NewTimer3、channel + time.After/time.NewTimercontext.WithTimeout + time.Afterfunc AsyncCall() { ctx, cancel := context.WithTime原创 2021-07-23 14:41:15 · 2804 阅读 · 0 评论 -
进程、线程以及Goroutine的区别
进程、线程、协程从内存、执行单元以及切换成本三个角度来考虑内存进程 操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。 进程的安全性比较⾼ 通信成本就比较⼤(通过IPC): 信号 管道 共享内存 socket⽹络通信 共享⽂件线程 操作系统调度(CPU调度)执⾏的最小单位。 共享资源,隔离性差 通信成本比较小 通过同步机制访问共享资源即可完成通信 线程是寄生在进程之上的执行原创 2021-07-02 15:44:16 · 213 阅读 · 0 评论 -
Docker
Docker是什么Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。Docker的三个概念镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。原创 2021-04-09 10:58:34 · 376 阅读 · 0 评论 -
两个栈实现一个队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )package mainimport ( "fmt")func main() { obj := Constructor() obj.AppendTail(3) obj.AppendTail(2) val := obj.DeleteHead() fmt.Printl原创 2021-03-30 20:47:20 · 110 阅读 · 0 评论 -
Go语言复习回顾
数据定义函数返回值问题在函数有多个返回值时,只要有⼀个返回值有名称,那么其他返回值也⼀定要有名称结构体的比较问题规则⼀: 只有相同的类型的结构体才可以⽐较(1 结构体的属性类型, 2 属性的顺序)规则⼀: 即使两个结构体的属性类型和顺序相同,但是⾥⾯存在不可⽐较类型,依然是不可以直接==⽐较的。 ⽐如 map,slice 可以参考⽤reflect.DeepEqual⽅法来进⾏⽐较string与nil类型的问题nil空值的赋值空值, 空指针,所有Golang中的引⽤类型原创 2021-03-18 15:22:35 · 169 阅读 · 0 评论 -
Golang中如何进行项目模块及依赖管理
什么是Go ModulesGo modules 是 Go 语⾔的依赖解决⽅案发布于 Go1.11成⻓于 Go1.12丰富于 Go1.13正式于 Go1.14 推荐在⽣产上使⽤。解决了什么问题 Go 语⾔⻓久以来的依赖管理问题 “淘汰”现有的 GOPATH 的使⽤模式。 统⼀社区中的其它的依赖管理⼯具(提供迁移功能)。GOPATH的弊端⽆版本控制概念⽆法同步⼀致第三⽅版本号⽆法指定当前项⽬引⽤的第三⽅版本号Go Modules模式go mod命令go mod init原创 2021-03-10 16:41:43 · 483 阅读 · 0 评论 -
Defer知识点
defer 的执行顺序/* 知识点一: defer 的执行顺序*/package mainimport "fmt"func func1() { fmt.Println("A")}func func2() { fmt.Println("B")}func func3() { fmt.Println("C")}func main() { defer func1() defer func2() defer func3()}输出:CBAdefer和retu原创 2021-03-09 09:13:47 · 160 阅读 · 0 评论 -
Go协程的小发现
package mainimport ( "fmt" "time")type myString stringfunc (v *myString) myMethod() { fmt.Println(*v)}// 理解为启动协程所耗时间比for循环结束时间要长,所以都是打印出不固定// go的时候对象已经被篡改了func bad1(values []myString) { for _, v := range values { go func() { fmt.Printl原创 2021-02-27 22:23:37 · 103 阅读 · 0 评论 -
Golang的⾯向对象思想
Golang的面向对象思想interface接口特点interface 是⽅法声明的集合任何类型的对象实现了在interface 接⼝中声明的全部⽅法,则表明该类型实现了该接⼝注意interface⼀定要和多态的特性结合面向对象的开闭原则平铺式的模块设计开闭原则的设计面向对象的依赖倒转原则耦合度极高的设计方式接口的意义多态的思想调用未来...原创 2021-02-26 08:35:55 · 119 阅读 · 1 评论 -
Golang中的GC垃圾回收机制
Go V1.3 之前的标记清除(mark and sweep)流程第⼀步,暂停程序业务逻辑, 找出不可达的对象,和可达对象第⼆步, 开始标记,程序找出它所有可达的对象,并做上标记第三步, 标记完了之后,然后开始清除未标记的对象第四步, 停⽌暂停,让程序继续跑。然后循环重复这个过程,直到process程序⽣命周期结束缺点Go V1.5 三色标记法Go V1.8 混合写屏障机制总结...原创 2021-02-21 20:36:45 · 271 阅读 · 0 评论 -
Golang的GMP学习笔记
Golang“调度器”由来单进程时代的两个问题单⼀执⾏流程、计算机只能⼀个任务⼀个任务处理进程阻塞所带来的的CPU浪费时间多进程、多线程的问题设计变得复杂 进程/线程的数量越多,切换成本就越⼤,也就越浪费 多线程 随着 同步竞争(如 锁、竞争资源冲突等多进程、多线程的壁垒 ⾼内存占⽤:进程占⽤虚拟内存4GB+线程占⽤内存约4MB ⾼CPU调度消耗协程(co-routine), 引发的问题N:1 ⽆法利⽤多个CPU、出现阻塞的瓶颈1:1 跟多线程/多进程原创 2021-02-15 15:52:11 · 547 阅读 · 0 评论 -
Golang中逃逸现象-变量何时 栈何时堆
变量的逃逸现象-将⼀个局部变量的地址返回给上层函数,依然能够访问,那么这个局部变量产⽣的了逃逸现象,当前变量应该并没有分配到栈上。package main//inline内联函数func foo(arg_val int) *int { var foo_val1 int = 11 var foo_val2 int = 12 var foo_val3 int = 13 var foo_val4 int = 14 var foo_val5 int = 15 //目的是防止编译器优化,优化成原创 2021-02-12 21:57:23 · 813 阅读 · 0 评论 -
Golang内存调试与CPU性能分析
如何分析程序的运行时间time指令time go run main.goreal 从程序开始到结束,实际上度过的时间user 程序在⽤户态度过的时间程序在内核态度过的时间 ⼀般情况下 real>= user + sys/usr/bin/time指令可以看到CPU占⽤率、内存的使⽤情况、进程的切换情况、⽂件系统IO、socket情况等如何分析Golang程序的内存使用情况内存的占用情况top -p $(pidof 进程名)mem 总体内存情况f原创 2021-02-11 22:56:32 · 819 阅读 · 0 评论 -
Gorm学习笔记
Go语言ORM框架:gorm/xormORM框架解决了对象/实例 与关系型数据库的映射,解决了程序员不想写数据库语句的问题对应关系数据表 <–> 类、结构体数据行 <–> 对象、实例数据字段 <–> 属性、结构体字段gorm中文文档:http://gorm.io/zh_CN/docs/github地址:https://github.com/jinzhu/gorm例子package mainimport原创 2021-02-11 22:55:45 · 263 阅读 · 0 评论 -
Go与Session
SessionSession可以理解为保存在服务端的键值对数据,只要存储介质够大,就可以存很大,比cookie存得多原创 2021-02-03 16:28:34 · 208 阅读 · 1 评论 -
Go使用Redis
Redis简介NoSQL(Not Only SQL),指的是非关系型的数据库。随着Web2.0的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。redis是一个key-value存储系统,类似还有Memcached。它支持存储的value类型相对更多,包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、带范围查原创 2021-01-26 21:26:49 · 389 阅读 · 0 评论 -
Go语言Web项目搭建
Web论坛搭建(后端部分)需求罗列根据前端提供的基础,实现业务逻辑的开发,主要包括:用户的登陆注册功能登陆后,用户具有撰写帖、修改帖子、阅读帖子以及删除帖子的需求提供一个相册,用户可以上传图片、展示图片实现一个分页机制,使得可以限定每页展示的帖子数量(即上一页,下一页)提供一个社区阅读排行榜,统计文章点击的数量,并且进行显示(类似于微博热搜)注意:项目需要提供一个配置组件,提供一个配置文件,减少后期代码的改动项目需要提供一个日志组件,便于记录/调试项目需要提供一个Session,原创 2021-01-20 21:54:06 · 7417 阅读 · 24 评论 -
Go的MySQL使用
Go的MySQL使用原创 2021-01-15 18:44:53 · 431 阅读 · 1 评论 -
Uber的Go编程规范
Go编程规范原创 2021-01-06 09:46:29 · 194 阅读 · 0 评论 -
Go语言的中间件
Go语言的中间件Gin框架下的中间件Go的net/http设计的⼀⼤特点就是特别容易构建中间件。gin也提供了类似的中间件。需要注意的是中间件只对注册过的路由函数起作⽤。对于分组路由,嵌套使⽤中间件,可以限定中间件的作⽤范围。中间件分为全局中间件,单个路由中间件和群组中间件。中间件和我们普通的 HandlerFunc 没有任何区别。我们怎么写 HandlerFunc 就可以怎么写⼀个中间件。例子1package mainimport ( "fmt" "github.com/gin-g原创 2020-12-30 09:36:04 · 704 阅读 · 2 评论 -
Gin框架
Gin框架数据绑定简单来说,,就是根据Body数据类型,将数据赋值到指定的结构体变量中 (类似于序列化和反序列化) 。Must bind⽅法:Bind , BindJSON , BindXML , BindQuery , BindYAML如果存在绑定错误,则⽤c终⽌请求,使⽤ c.AbortWithError (400) .SetType (ErrorTypeBind) 即可。如果想更好地控制⾏为,可以考虑使⽤ShouldBind等效⽅法.Should bind方法:ShouldBind原创 2020-12-21 21:04:59 · 954 阅读 · 0 评论 -
Go单元测试
Go单元测试原创 2020-12-11 22:56:46 · 106 阅读 · 1 评论 -
HttpRouter源码分析
HttpRouter源码分析简单来说, httprouter 的 router 维护了⼀个 trees(树) ,它是⼀个map。这个map的 key 就是各种HTTP请求⽅法,对应的值就是⼀个 node(节点) 。也就是路由器为每个请求⽅法管理⼀个单独的树。httprouter路由原理路由器依赖于⼤量使⽤通⽤前缀的树结构,它基本上是⼀个紧凑的前缀树(或只是基数树)。具有公共前缀的节点也共享⼀个公共的⽗节点。举例:router := httprouter.New()router.GET("原创 2020-11-25 21:08:04 · 791 阅读 · 0 评论 -
GoMod的使用
开启 Go module 功能Go module 功能需要您的 Go 版本在 Go 1.11 及以上GoMod用于管理依赖包配置 Goproxy 环境变量由于GitHub需要科学上网,故如下设置:go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct即设置环境变量:GOPROXY=“https://goproxy.io”如果包被屏蔽(墙),可以使用这个命令,随后使用g原创 2020-12-30 09:31:09 · 223 阅读 · 1 评论 -
Go实现简易的Web登陆交互
效果图:源代码package mainimport ( "fmt" "html/template" "log" "net/http" "time")type Item struct { Name string Price int}// 登陆页面func loginhanler(w http.ResponseWriter, r *http.Request) { // 如果是post请求,注意先后顺序 if r.Method == http.MethodPost原创 2020-11-15 00:00:02 · 1169 阅读 · 1 评论 -
Web开发与XSS攻击
XSS 是⼀种常⻅的攻击形式。在论坛之类的可以接受⽤户输⼊的⽹站,攻击者可以内容中添加 script 标签。如果⽹站未对输⼊的内容进⾏处理, 其他⽤户浏览该⻚⾯时, script 标签中的内容就会被执⾏,泄露⽤户的私密信息或利⽤⽤户的权限做破坏。因为 Go 模板有上下⽂感知的功能,它检测到在 HTML ⻚⾯中,所以输⼊数据会被转义。查看⽹⻚源码可以看到转义后的结果。转义之后的代码就不会执⾏了。那么如何才能不转义呢?func xssHandler(w http.ResponseWriter,原创 2020-11-14 22:00:43 · 91 阅读 · 0 评论 -
梳理net/http代码的执⾏流程
⾸先调⽤Http.HandleFunc按顺序做了⼏件事:1 调⽤了DefaultServeMux的HandleFunc2 调⽤了DefaultServeMux的Handle3 往DefaultServeMux的map[string]muxEntry中增加对应的handler和路由规则其次调⽤http.ListenAndServe(":8080", nil)按顺序做了⼏件事情:1 实例化Server2 调⽤Server的ListenAndServe()3 调⽤net.Listen(“tcp”原创 2020-11-04 11:40:35 · 133 阅读 · 0 评论 -
Go模板总结
asd原创 2020-10-20 09:17:54 · 1375 阅读 · 1 评论 -
Go处理Cookie
sa原创 2020-09-05 22:32:51 · 671 阅读 · 0 评论 -
Go通过Web解析json
mark原创 2020-08-24 10:10:12 · 286 阅读 · 0 评论 -
Go语言Web基础总结
现代Web服务Web⼯作⽅式浏览器本身是⼀个客户端,当你输⼊URL的时候,⾸先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建⽴TCP连接,等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调⽤⾃身服务,返回HTTP Response(响应)包;客户端收到来⾃服务器的响应后开始渲染这个Response包⾥的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。简单归纳为:原创 2020-07-19 23:56:42 · 607 阅读 · 0 评论 -
Go统计垃圾点得分题目
package mainimport ( "fmt")// 定义坐标结构type Position struct { x int y int}func main() { // 第一行读入垃圾数量 garbageNum := 0 fmt.Scanf("%d", &garbageNum) // 根据垃圾数量,创建对应大小的切片 garbageArr := make([]Position, garbageNum) for i := 0; i < gar...原创 2020-07-10 18:55:51 · 123 阅读 · 0 评论 -
Go语言思维导图(基础回顾)
原创 2020-05-19 14:45:35 · 1540 阅读 · 0 评论 -
Go的条件等待、单次执行和并发安全Map
条件等待(sync.Cond)条件等待和互斥锁有不同,互斥锁是不同协程公用一个锁,条件等待是不同协程各用一个锁,但是wait()方法调用会等待(阻塞),直到有信号发过来,不同协程是共用信号。package mainimport ("fmt""sync""time")func main() {var wg sync.WaitGroupcond := sync.NewCond(n...原创 2020-04-15 11:45:50 · 313 阅读 · 1 评论 -
goroutine原理的图文详解
Go并发模型 Don’t communicate by sharing memory; share memory by communicating. 不要以共享内存的⽅式来通信,要通过通信来共享内存。Go调度器GMPGo语⾔运⾏时环境提供了⾮常强⼤的管理goroutine和系统内核线程的调度器, 内部提供了三种对象: Goroutine, Machine, Processor。Go...原创 2020-04-09 19:24:36 · 3075 阅读 · 1 评论 -
Go语言的GC详解
前言Garbage Collection (GC)是⼀种⾃动管理内存的⽅式。⽀持GC的语⾔⽆需⼿动管理内存,程序后台⾃动判断对象。是否存活并回收其内存空间,使开发⼈员从内存管理上解脱出来。垃圾回收机制引⽤计数标记清除三⾊标记分代收集发展版本 ——发布时间——GC ——————————STW时间v 1.1 ——2013/5 ——STW ——————————百ms-⼏百ms级别...原创 2020-04-07 21:08:05 · 3577 阅读 · 1 评论 -
Goroutine中的2种常见使用模型搭建
生产者消费者模型该模型较为简单,一个生产任务,一个做任务,中间通过goroutine来完成协同工作。package mainimport ( "fmt" "time")// 生产者: 生成 factor 整数倍的序列列func Producer(factor int, out chan<- int) { for i := 0; ; i++ { out <-...原创 2020-04-07 20:24:59 · 178 阅读 · 0 评论