深入学习用 Go 编写 HTTP 服务器

Go是一门通用的编程语言,想要学习 Go 语言的 Web 开发,就必须知道如何用 Go 启动一个 HTTP 服务器用于接收和响应来自客户端的 HTTP 请求。用 Go实现一个http server非常容易,Go 语言标准库net/http自带了一系列结构和方法来帮助开发者简化 HTTP 服务开发的相关流程。因此,我们不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。这篇文章会学习如何用net/http自己编写实现一个HTTP Serve并探究其实现原理,以此来学习了解网络编程...阅读全文

Segmentfault 2020-02-03 05:32:32 Kevin

leetcode_56

Golang: 思路:试想,如果给我们的是按照intervals[i][0]大小顺序排列好的数组,那么我们在做数组合并的时候是否会简单一些呢?答案是肯定的,而且需要注意的是,题意中给的测试用例是按照我上文提及的顺序排列好的,但题目里并没有给出数组是排列好的这一句话。所以,要首先对数组做按照intervals[i][0]大小顺序排列的操作。然后,是如何对数组进行合并及存储呢?不难看出,我们只需要对intervals[i][1]和intervals[i+1][0]进行比较,至于怎么个比较法,各位可以...阅读全文

简书 2020-01-27 22:32:44 淳属虚构

golang并发编程tips

作为服务端的开发,最关注的就是并发编程,每个从java接触到golang的小伙伴应该都会有一些共同的困惑,做个总结 从java转到golang的一些类比: atomic.Value的用途和volatile类似 sync.Mutex、sync.RWMutex和ReentrantLock、ReentrantReadWriteLock类似 sync.WaitGroup和CountDownLauch类似 channel和future或者阻塞队列类似 sync.Map和ConcurrentHashMap类...阅读全文

简书 2020-01-27 22:32:44 肥肥小浣熊

开源的服务器框架你都知道吗

今天最悲痛的消息莫过于科比的离去,RIP,传奇科比,精神不朽。 有哪些开源游戏服务器框架,值得学习呢。基于node.js 、java、C#、golang 、c++、python 等技术栈有各种各样的游戏框架。 本文收集一些比较常用的 github上star和fork有一定数量的较为完整的框架 skynet skynet 云风大神的框架这个基本上使用很多的, c+lua的框架。skynet只能算是网络层的轮子但是因为其众多的用户还是很不错的,主要的思想是基于Actor模型,Actor之间通信的唯一...阅读全文

简书 2020-01-27 22:32:43 香菜聊游戏

Go内存管理之TCMalloc

转自公众号:灰子学技术,原文链接:https://mp.weixin.qq.com/s/-b26YiHjL3V9CNvk0LZmEgTCMalloc作为Go语言内存管理的核心算法,是理解和掌握Go的内存管理非常重要的一步,本章主要介绍TCMalloc的是什么样子的。TCMalloc的概述 TCMalloc全称是Thread-Caching Malloc,是Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征...阅读全文

简书 2020-01-27 17:32:46 灰常出色

golang中协程与线程的区别

1、goroutine中栈的大小是动态变化的每个os线程都有一个固定大小的栈内存(通常为2MB),栈内存用于保存在其他函数调用期间那些正在执行或临时暂停的函数中的局部变量。而goroutine在生命周期开始时只有一个很小的栈(通常为2KB),goroutine的栈不是固定大小的,它可以按需增大和缩小。所以goroutine能够更高效的使用栈空间。2、goroutine调度os线程是由操作系统内核调度的,所以控制权限从一个线程到另一个线程需要一次完整的上下文切换:即保存一个线程的状态到内存,再恢复...阅读全文

简书 2020-01-27 17:32:45 皮斯勒夫

Go内存管理之TCMalloc

转自公众号:灰子学技术,原文链接:https://mp.weixin.qq.com/s/-b26YiHjL3V9CNvk0LZmEgTCMalloc作为Go语言内存管理的核心算法,是理解和掌握Go的内存管理非常重要的一步,本章主要介绍TCMalloc的是什么样子的。TCMalloc的概述TCMalloc全称是Thread-Caching Malloc,是Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征:...阅读全文

Go语言中文网 2020-01-27 17:08:32 ZhDavis

初识GoLang

1、概念 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 2、特点 简洁、快速、安全 Go语言语法简单易学、学习曲线平缓,相比于C/C++,Go语言具有很高的开发效...阅读全文

简书 2020-01-27 13:32:41 kjkongjun

Go: Commit失败后是否需要Rollback

最近使用sqlmock编写单元测试时遇到一个问题。现有这样的代码: defer func() { if err != nil { err = tx.Rollback() ... } } err = tx.Commit() 如果 tx.Commit() 失败了,那么 Rollback 的 mock assertion 不会被触发。但跟踪代码时我看到 tx.Rollback() 路径确实会被执行到的。 起初我以为是 sqlmock 的 bug,但是追踪代码时发现,sqlmock 的 assertio...阅读全文

Segmentfault 2020-02-02 19:32:31 spacewander

了解 Go 的不可寻址值和切片

Dave Cheney 最近在 Twitter 上发布了一个 Go 的小测验,和往常一样,我从中学到了一些有趣的东西。让我们从他的推文开始: `#golang` 小测验:该程序打印什么? ```go package main import ( "crypto/sha1" "fmt" ) func main() { input := []byte("Hello, playground") hash := sha1.Sum(input)...阅读全文

Go语言中文网 2020-01-27 12:09:29 polaris

Go 中的黑桃 A:使用结构体创建命名空间

假设,但不是凭空想象,在你的程序中,你注册了一堆 [expvar 包的统计变量](https://golang.org/pkg/expvar/),用来在暴露出去的 JSON 结果中能有一个容易辨识的名字。普通的实现方式下,你可能会有一大堆全局变量,对应着程序追踪的各种信息。这些变量与其他的全局变量混成一团,这毫无美感,如果我们能规避这种情况,那么事情会变得不那么糟糕。 归功于 Go 对匿名结构类型的支持,我们可以实现。我们可以基于匿名结构类型创建一个变量集合的命名空间: ```go ...阅读全文

Go语言中文网 2020-01-27 12:01:08 lxbwolf

Kubernetes之ingress controller--contour

contour 是基于envoy实现的kubernetes ingress controller。除了支持官方的Ingress对象,Ingress对象一直没有处于beta阶段,发展比较慢,无法满足实际生产使用,社区通过注解的方式扩展,以表达HTTP路由缺少的属性。 而且还支持了HTTPProxy 。HTTPProxy 是通过自定义资源定义(CRD)的方式扩展Ingress API的功能,以提供更丰富的用户体验,并解决后者在多租户环境中使用的限制。 有如下的优势: 安全地支持多团队Kubernet...阅读全文

Segmentfault 2020-02-02 11:32:33 iyacontrol

[Go - Note] go中json序列化(Encode)和反序列化(Decode)以及struct tag

import "encoding/json" struct tag 可以选择的控制字段有几种: * `-`:不要解析这个字段 * `omitempty`:当字段为空(默认值)时,不要解析这个字段。比如 false、0、nil、长度为 0 的 array,map,slice,string * `FieldName`:当解析 json 的时候,使用这个名字 * type,有些时候,我们在序列化或者反序列化的时候,可能结构体类型和需要的类型不一致,这个时候可以指定,支持string,number和bo...阅读全文

Segmentfault 2020-02-02 11:32:32 Arboat

[Go - Basic] Print相关

log和fmt中print区别: log和fmt中都有Printf,Println,Printf 三个函数实现,区别再去log是线程安全且有格式便于定制存储log, 所以如果为了输出log用log包,如果为了格式化字符串用fmt包。 几种print 1.Printf: 输出到控制台2.Println:输出到控制台并换行, 可打印字符串在内的变量3.Printf:只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出整形变量和整形等)4.Sprintf:格式化并返回一个字符串而不带...阅读全文

Segmentfault 2020-01-31 21:32:32 Arboat

leetcode_54

Golang: 声明:这题我首先用了JAVA语言去实现,在通过所有测试用例后,发现结果如下: 测试结果 我觉得我实现的超烂,时间复杂度上(我预估)是超烂,空间复杂度上(从程序里就能看出来)也是超烂,结果这个程序的时间复杂度这么好? 思路:因为我今天是第一次做这道题,所以在所有算法里我可能会先写暴力一点的算法,即先做出来,再考虑优化。先上暴力求解的思路,即通过循环来实现,我们可以很明显的看出,螺旋式,其实就像剥洋葱一样,是一层一层地去剥的,我们可以拆解为,先输出最外圈,再输出内圈,当第一层外圈被输...阅读全文

简书 2020-01-27 04:32:39 淳属虚构

Golang package sync 剖析(一): sync.Once

前言 Go语言在设计上对同步(Synchronization,数据同步和线程同步)提供大量的支持,比如 goroutine和channel同步原语,库层面有 sync:提供基本的同步原语(比如Mutex、RWMutex、Locker)和 工具类(Once、WaitGroup、Cond、Pool、Map) sync/atomic:提供变量的原子操作(基于硬件指令 compare-and-swap) 注意:当我说“类”时,是指 Go 里的 struct(单身狗要有面向“对象”编程的觉悟)。 Go语言...阅读全文

Segmentfault 2020-02-01 08:32:38 oscarzhao

golang 服务大量 CLOSE_WAIT 故障排查

事故经过 排查 总结 事故经过 【2019-12-27 18:00 周五】业务方突然找来说调用我们程序大量提示“触发限流”,但是我们没有收到任何监控报警。紧急查看了下 ServiceMesh sidecar 代理监控发现流量持续在减少,但是监控中没有任何触发限流的 http code 429 占比,如果有触发限流我们会收到报警。 后来通过排查是程序中有一个历史限流逻辑触发了,但是程序中触发限流返回的 http code 是 200,这就完全避开了 sidecar http code 非200 异...阅读全文

51CTO博客 2020-01-26 13:32:26 王清培

leetcode_51

Golang: 思路:八皇后问题拓展而来的N皇后问题,经典算法题这里就不做讲解了 func solveNQueens(n int) [][]string { var res [][]string chessboard:=make([]int,n) placeQueen(&res,chessboard,n,0) return res } func checkResult(chessboard []int,n int) bool { for i:=0; i<n; i++ { if chessboar...阅读全文

简书 2020-01-26 20:32:40 淳属虚构

leetcode_52

Golang: 思路:和51是一个问题 注意:这里需要注意下:因为不想使用list去存储所有出现的结果(会导致空间复杂度变高),所以我使用了一个全局变量totalRes来表示单次测试的结果,但因为平台运行测试用例的机制,是会使用一段代码一次性跑多个测试用例。所以,每次运行totalNQueens这个方法时,都需要将totalRes置零,否则会报错。 不通过示例如上图 var totalRes int func main() { fmt.Println(totalNQueens(1)) } fun...阅读全文

简书 2020-01-26 20:32:40 淳属虚构