Golang
stevsun
Keep calm and carry on
展开
-
sarama 源码学习
ConsumerGroupKafka 消费的过程似乎大致上可以分为 ConsumerGroup 的 Rebalance 协议和 Partition 消费协议两部分,这里先看 ConsumerGroup 部分。ConsumerGroup 的 Rebalance 是 Kafka 消费侧扩展性的体现,通过将 Partition 分配给 Consumer 实现扩展消费能力,在增加 Consumer 时执行 Rebalance,将 Partition 重新均摊给新加入的 Consumer,是一个 pre-shar转载 2020-11-10 15:43:59 · 2719 阅读 · 1 评论 -
Go 函数选项模式
Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的配置.在很多语言中这很容易; 在 C 族语言中, 可以使用不同数量的参数提供相同函数的多个版本; 在像 PHP 这样的语言中, 可以给参数一个默认值,并在调用方法时忽略它们. 但是在 Golang 中, 这两种方式你哪个也用不了. 那么你如何创建一个函数, 用户可以指定一些额外的配置?有很多可能的方法可以做到这一点, 但是大转载 2020-10-28 17:50:56 · 343 阅读 · 0 评论 -
Go中json.Unmarshal对数字类型的处理
JSON的规范中,对于数字类型,并不区分是整型还是浮点型。对于如下JSON文本:{ "name": "ethancai", "fansCount": 9223372036854775807}如果反序列化的时候指定明确的结构体和变量类型package mainimport ( "encoding/json" "fmt")type User struct { Name string FansCount int64}func m转载 2020-10-20 11:34:42 · 4208 阅读 · 1 评论 -
Go context 超时控制
常见方法context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) // 指定时长超时结束context.WithCancel(parent Context) (ctx Context, cancel CancelFunc) // 手动结束context.WithDeadline(parent Context, d time.Time) (Context, CancelFunc) // 指定时间结束转载 2020-09-17 15:33:58 · 2148 阅读 · 1 评论 -
Go 在orm中使用反射
作为静态语言,golang 稍显笨拙,还好 go 的标准包reflect(反射)包弥补了这点不足,它提供了一系列强大的 API,能够根据执行过程中对象的类型来改变程序控制流。本文将通过设计并实现一个简易的 mysql orm 来学习它,要求读者了解mysql基本知识,并且跟我一样至少已经接触 golang 两到三个月。orm 这个概念相信同学们都非常熟悉,尤其是写过rails的同学,对active_record的强大肯定深有体会(得益于的method_missing和define_method方法,少写了转载 2020-09-14 21:49:15 · 703 阅读 · 0 评论 -
Go 语言中Select与for结合使用break
func test(){ i := 0 for { select { case <-time.After(time.Second * time.Duration(2)): i++ if i == 5{ fmt.Println("break now") break } fmt.Println("i转载 2020-09-14 17:14:38 · 1697 阅读 · 0 评论 -
Go并发模型:合理退出并发协程
目录说明master:使用stop通道,主动告知goroutine退出stop_channel:和master相同detect_close_channel: 示例可以使用for-range替代for-select,range能检测通道关闭,自动退出detect_close_channel_v2:在前一个基础上,增加了监控功能,必须使用for-select,使用ok方法检测通道关闭,退出协程goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这转载 2020-09-14 14:40:01 · 783 阅读 · 0 评论 -
Go并发模型:流水线模型
Go作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,Go并发模型有多种模式,通过流水线模型系列文章,你会更好的使用Go的并发特性,提高的程序性能。这篇文章主要介绍流水线模型的流水线概念,后面文章介绍流水线模型的FAN-IN和FAN-OUT,最后介绍下如何合理的关闭流水线的协程。Golang的并发核心思路Golang并发核心思路是关注数据流动。数据流动的过程交给channel,数据处理的每个环节都交给goroutine,把这些流程画起来,有始有终形成一条线,那就能构成流水线模型。但转载 2020-09-14 14:31:55 · 950 阅读 · 0 评论 -
Go 依赖注入库dig
简介今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。快速使用第三方库需要先安装,由于我们的示例中使用了前面介绍的go-ini和go-flags,这两个库也需要安装:$ go get go.uber.org/dig$ go get gopkg.in/ini.v1$ go get github.转载 2020-09-13 17:15:37 · 937 阅读 · 0 评论 -
Golang视角下的设计模式
这篇文章想聊聊Golang语言下的设计模式问题,我觉得这个话题还是比较有意思的。Golang没有像java那样对设计模式疯狂的迷恋,而是摆出了一份“看庭前花开花落,望天空云卷云舒”的姿态。单例模式:Gloang的单例模式该怎么写?随手写一个,不错,立马写出来了。但这个代码有什么问题呢?多个协程同时执行这段代码就会出现问题:instance可能会被赋值多次,这段代码是线程不安全的代码。那么如何保证在多线程下只执行一次呢?条件反射:加锁。。。加锁是可以解决问题。但不是最优的方案,因为如果有1W并发,每一个线转载 2020-09-09 21:19:49 · 203 阅读 · 0 评论 -
Golang test编译使用
创建文件my_test.gopackage testsimport "testing"func TestMy(t *testing.T) { t.Log("TestMy")}通常用法:$ go test -v -run TestMy my_test.go=== RUN TestMy TestMy: my_test.go:6: TestMy--- PASS: TestMy (0.00s)PASSok command-line-arguments 0.619s原创 2020-07-23 12:27:13 · 2042 阅读 · 0 评论 -
使用 Gomock 进行单元测试
在实际项目中,需要进行单元测试的时候。却往往发现有一大堆依赖项。这时候就是 Gomock 大显身手的时候了Gomock 是 Go 语言的一个 mock 框架,官方的那种。安装$ go get -u github.com/golang/mock/gomock$ go install github.com/golang/mock/mockgen第一步:我们将安装 gomock 第三方库和...转载 2020-04-12 22:26:29 · 3547 阅读 · 1 评论 -
Go调试工具Delve
安装首先你必须有等于或高于1.8版本的Go,我的版本是:userdeMBP:go-learning user$ go versiongo version go1.11.4 darwin/amd64我是用的是Mac,所以使用的是OSX安装方法:然后使用go get 进行安装:go get -u github.com/go-delve/delve/cmd/dlv使用这种方法,你将无法...转载 2020-04-10 17:43:48 · 1397 阅读 · 0 评论 -
Go堆排序
package mainimport "fmt"// Heap 定义堆排序过程中使用的堆结构type Heap struct { arr []int // 用来存储堆的数据 size int // 用来标识堆的大小}// adjustHeap 用于调整堆,保持堆的固有性质func adjustHeap(h Heap, parentNode int) ...转载 2020-04-09 22:24:44 · 317 阅读 · 0 评论 -
Go遍历二叉树
package main import "fmt"type Node struct { Val int Left *Node Right *Node}// 1// / \// 2 3// / \ / \// 4 5 6 7func main() { head := &No...原创 2020-04-08 17:21:59 · 326 阅读 · 0 评论 -
Go单链表反转
package mainimport ( "fmt")type Node struct { Val int Next *Node}func reverse(listNode *Node) *Node { var node *Node head := listNode for head != nil { head.Nex...原创 2020-04-03 23:38:37 · 1393 阅读 · 0 评论 -
Golang调用so文件示例
测试动态库test_so.hint test_so_func(int a,int b);test_so.c#include "test_so.h"int test_so_func(int a,int b){ return a*b;}生成sogcc -shared ./test_so.c -o test_so.so复制so文件到Go项目目录Go项目目录load...转载 2020-04-01 15:39:27 · 7431 阅读 · 2 评论 -
Golang跟踪剖析trace的使用
单单使用 PProf 有时候不一定足够完整,因为在真实的程序中还包含许多的隐藏动作,例如 Goroutine 在执行时会做哪些操作?执行/阻塞了多长时间?在什么时候阻止?在哪里被阻止的?谁又锁/解锁了它们?GC 是怎么影响到 Goroutine 的执行的?这些东西用 PProf 是很难分析出来的,但如果你又想知道上述的答案的话,你可以用本文的主角 go tool trace 来打开新世界的大门。...转载 2020-03-31 21:58:46 · 9317 阅读 · 0 评论 -
Go优雅的重启服务
知识点信号量的了解。应用热更新。本文目标在前面编写案例代码时,我相信你会想到,每次更新完代码,更新完配置文件后,就直接这么 ctrl+c 真的没问题吗,ctrl+c到底做了些什么事情呢?在这一节中我们简单讲述 ctrl+c 背后的信号以及如何在Gin中优雅的重启服务,也就是对 HTTP 服务进行热更新。ctrl + c内核在某些情况下发送信号,比如在进程往一个已经关闭的管道写数...转载 2020-03-29 22:31:06 · 1984 阅读 · 0 评论 -
Go Modules 入门
Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。而 Go1.14,在近期也终于正式发布,Go 官方亲自 “喊” 你来用:因此在今天这篇文章中,我...转载 2020-03-29 14:56:19 · 675 阅读 · 0 评论 -
Go二分查找
package mainimport "fmt"func main() { data := []int{1,2,3,4,5,8,10} fmt.Println(binFind(data,8)) fmt.Println(binFind(data,9))}func binFind(data []int, item int) int { if len(dat...原创 2020-03-27 12:48:47 · 413 阅读 · 0 评论 -
Golang高性能分析
本文主要介绍了 Go 程序为了实现极高的并发性能,其内部调度器的实现架构(G-P-M 模型),以及为了最大限度利用计算资源,Go 调度器是如何处理线程阻塞的场景。怎么让我们的系统更快随着信息技术的迅速发展,单台服务器处理能力越来越强,迫使编程模式由从前的串行模式升级到并发模型。并发模型包含 IO 多路复用、多进程以及多线程,这几种模型都各有优劣,现代复杂的高并发架构大多是几种模型协同使用,不...转载 2020-03-15 10:44:37 · 1101 阅读 · 0 评论 -
Go归并排序
package mainimport "fmt"func main() { data := []int{8, 9, 5, 7, 1, 2, 5, 7, 6, 3, 5, 4, 8, 1, 8, 5, 3, 5, 8, 4} fmt.Println(data) data = mergeSort(data) fmt.Println(data)}func m...原创 2020-03-14 14:51:18 · 220 阅读 · 0 评论 -
Golang支持平滑升级的HTTP服务
前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。一、平滑升级(优雅重启)的一般思路一般情况下,要实现平滑升级,...转载 2020-03-09 21:42:28 · 437 阅读 · 0 评论 -
Golang服务平滑重启
服务端代码经常需要升级,对于线上系统的升级常用的做法是,通过前端的负载均衡(如nginx)来保证升级时至少有一个服务可用,依次(灰度)升级。而另一种更方便的方法是在应用上做热重启,直接升级应用而不停服务。原理热重启的原理非常简单,但是涉及到一些系统调用以及父子进程之间文件句柄的传递等等细节比较多。处理过程分为以下几个步骤:监听信号(USR2)收到信号时fork子进程(使用相同的启动命...转载 2020-03-09 21:31:29 · 2901 阅读 · 0 评论 -
Goroutine调度机制
一、什么是Goroutine?Goroutine是go中最为关键的一个设计,在go提供的各种基础包中都能看到它的身影,goroutine实际上就是go语言提供的协程,但是此处要注意,这里的协程并不是传统意义上的协程。传统意义上的协程是指用户态线程,但是go所实现的协程实际上是两级线程模型,关于线程模型可以参考(https://blog.csdn.net/gatieme/article/detai...转载 2020-03-09 20:50:36 · 1030 阅读 · 0 评论 -
Goroutine泄漏
概述在Go中,goroutine很轻量级,随便创建成千上万个goroutine不是问题,但要注意,要是这么多的goroutine一致递增,而不退出,不释放资源,可就麻烦了。 本文介绍goroutine泄露的实际场景,并讨论如何解决该问题。产生原因分析产生goroutine leak(协程泄露)的原因可能有以下几种:goroutine由于channel的读/写端退出而一直阻塞,导致goro...转载 2020-03-03 13:22:45 · 2007 阅读 · 0 评论 -
Golang functional options
当我们定义了一个对象时,一般会创建一个方法方便外部初始化一个实例。如下面的例子:type Client struct { timeout int64 dialFunc func() error healthCheck func() bool} func NewClient(timeout int64, dialFunc func() error, healthChec...转载 2020-02-27 15:46:42 · 408 阅读 · 0 评论 -
Uber Go 语言编程规范
文章目录1. 介绍2. 编程指南2.1 指向 Interface 的指针2.2 Receiver 和 Interface2.3 mutex 默认 0 值是合法的2.4 拷贝 Slice 和 Map2.5 使用 defer 做资源清理2.6 channel 的 size 最好是 1 或者是 unbuffered2.7 枚举变量应该从 1 开始2.8 Error 类型2.9 Error Wrappin...转载 2020-02-27 12:41:01 · 377 阅读 · 0 评论 -
Go实现简单快速排序
package mainimport "fmt"func main() { l := []int{5,6,3,2,7,9,8,1} fmt.Println(l) fmt.Println(quickSort(l))}func quickSort(list []int) []int { l := len(list) if l == 0 { ...原创 2020-01-17 13:58:35 · 233 阅读 · 1 评论 -
Go语言有序链表归并
代码示例:package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func main() { a := []int{1,3,5,7,9} b := []int{2,4,6,8} l1 := initList(a) l2 := initList(b) ...原创 2020-01-17 09:59:10 · 237 阅读 · 0 评论 -
Go程序调试工具介绍(gdb vs dlv)
文章目录准备工作gdb调试程序dlv调试程序dlv前端(gdlv)结论通过log库输出日志,我们可以对程序进行异常分析和问题追踪。但有时候,我也希望能有更直接的程序跟踪及定位工具能够帮助我们更方便快捷的追踪、定位问题,最直观的感觉还是使用调试器。Linux平台下,原生的C/C++程序,我们往往使用gdb进行程序调试,切换到Golang,我们同样还是可以使用gdb进行调试。同时我们还可以使用gol...转载 2020-01-16 11:33:15 · 1989 阅读 · 0 评论 -
Go语言接口详解
文章目录什么是接口接口声明接口类型值静态类型和动态类型nil 接口值实现接口空接口实现多个接口类型断言类型选择接口嵌套使用指针接收者和值接收者实现接口什么是接口在一些面向对象的编程语言中,例如 Java、PHP 等,接口定义了对象的行为,只指定了对象应该做什么。行为的具体实现取决于对象。在 Go 语言中,接口是一组方法的集合,但不包含方法的实现、是抽象的,接口中也不能包含变量。当一个类型 T...转载 2020-01-15 16:54:34 · 347 阅读 · 0 评论 -
Go语言指针
文章目录什么是指针指针声明如何使用指针关于空指针指针作为函数参数使用不常用的new函数什么是指针写代码的时候,我们通过变量就可以操作存储在内存中的值,进行赋值、加减运算等。大家有没有想过,变量代表什么呢?其实,一个变量对应一段内存空间,这段空间就存储了该变量相对应类型的值。指针的值就对应变量的地址,只通过指针,就可以更新或者读取变量的值,而不需要用到变量名。var i int = 10 ...转载 2020-01-15 16:27:18 · 223 阅读 · 0 评论 -
Go语言Map
文章目录前言创建与初始化使用Make函数使用字面量如何使用MapDelete 删除键值对遍历Maplen函数Map是一种引用类型前言Hash表是一种巧妙并且实用的数据结构,是一个无序的key/value对的集合,其中所有的key都是不同的,通过给定的key可以在常数时间复杂度内检索、更新或删除对应的 value 。Map其实是一个 Hash 表的引用,能够基于键快速检索出数据,键就像索引一样指...转载 2020-01-15 16:17:48 · 173 阅读 · 0 评论 -
Go语言的静态类型和动态类型示例
先来看个简单的go程序:package main import ( "fmt") type TaskIntf interface { Process()} type Task struct { TaskId string X int Y int} func (p *Task)Process() { fmt.Printf("%+v\n", p)} f...转载 2020-01-15 15:57:27 · 1315 阅读 · 1 评论 -
Golang 类型别名和类型定义
Golang语言中存在一个关键字type,type又有两种使用方式,一种是类型别名,一种是类型定义,是不是熟悉的C语言(define和typedef)味道?类型定义type Student struct { name String age int}type I int类型别名type Sdt = Studenttype I = int他们之间有什么区别呢?区别...转载 2020-01-14 17:41:56 · 1594 阅读 · 0 评论 -
Go语言goroutine分析
Goroutine是Go里的一种轻量级线程——协程。相对线程,协程的优势就在于它非常轻量级,进行上下文切换的代价非常的小。对于一个goroutine ,每个结构体G中有一个sched的属性就是用来保存它上下文的。这样,goroutine 就可以很轻易的来回切换。由于其上下文切换在用户态下发生,根本不必进入内核态,所以速度很快。而且只有当前goroutine 的 PC, SP等少量信息需要保存。在...转载 2020-01-03 18:00:59 · 458 阅读 · 0 评论 -
Go语言goroutine并发模型
文章目录简介stack管理G-M-P队列状态上下文切换调度异步调用同步调用任务窃取g0codenewstartschdule参考简介stackOS线程初始栈为2MB。Go语言中,每个goroutine采用动态扩容方式,初始2KB,按需增长,最大1G。此外GC会收缩栈空间。BTW,增长扩容都是有代价的,需要copy数据到新的stack,所以初始2KB可能有些性能问题。更多关于stack的内...转载 2020-01-03 17:49:23 · 366 阅读 · 0 评论 -
Go语言内存管理
文章目录前言基础概念spanclassspan数据结构cachecentralheap内存分配过程总结前言编写过C语言程序的肯定知道通过malloc()方法动态申请内存,其中内存分配器使用的是glibc提供的ptmalloc2。除了glibc,业界比较出名的内存分配器有Google的tcmalloc和Facebook的jemalloc。二者在避免内存碎片和性能上均比glic有比较大的优势,在...转载 2019-12-28 18:11:50 · 234 阅读 · 0 评论