
golang
柳清风09
这个作者很懒,什么都没留下…
展开
-
beego write header 坑
一个普通公共方法,主要是处理json个数数据返回。// Response return responsefunc (c *BaseController) Response(code int, data interface{}) { c.Ctx.ResponseWriter.WriteHeader(code) c.Data["json"] = data c.ServeJSON()}ServeJSON里面调用JSON方法,如下func (output *BeegoOutput) JSON(da原创 2020-08-18 09:58:23 · 1540 阅读 · 0 评论 -
delta coding入门
增量编码(delta coding)通过维护增量的方式,保存数据,这样能够达到更好的压缩比,对于保存连续的或者数据段在一个稳定范围内出现的场景,效果更好。 下面是我用go代码简单实现package mainimport ( "fmt")func main() { buf := []int{1,2,3,5,5,6} delta_encode(buf) fmt.Pri原创 2017-05-09 14:26:48 · 3794 阅读 · 0 评论 -
go基础知识整理(一)
go语言还是一个非常年轻的语言,相比于java那种工程级别的语言来说,很多地方还有待提升。下面谈一下go的基本知识continue、break个goto的使用 如果使用过C或者Java之类的语言,对这个应当非常了解。 下面先看一个列子:package mainimport "fmt"func main() { for i:= 0;i<10 ;i++ { if i==5{原创 2017-11-11 10:00:54 · 36522 阅读 · 0 评论 -
golang websocket 入门
我们先写一个最简单的go http服务package mainimport ( "net/http")func main() { http.HandleFunc("/", func(w http.ResponseWriter,r *http.Request) { w.Write([]byte("hello world")) }) http.Liste原创 2017-11-04 15:35:26 · 40065 阅读 · 0 评论 -
基于go websocket写一个聊天室
上一篇介绍了一下go websocket,这篇blog主要是通过websocket写一个聊天室。 先写前端</style></head><body><div id="log"></div><form id="form"> <input type="submit" value="Send" /> <input type="text" id="msg" size="64"/>原创 2017-11-04 16:22:43 · 38101 阅读 · 0 评论 -
用golang写一个proxy
我复杂的网络环境中,proxy是个很有用的工具,我们可以通过proxy代理帮我们完成网络流量的转发。 这个proxy得先能接收请求,所以这里先启动一个tcp的监听,获取请求func (s *Server) Start() { var err error s.listener, err = net.Listen("tcp", s.addr) if err != nil {原创 2017-12-25 09:03:40 · 40786 阅读 · 0 评论 -
golang 源码分析之URL编码规范
首先看一下url编码规范: backspace %08 tab %09 linefeed %0A creturn %0D space %20 ! %21 " %22 #原创 2017-12-26 15:27:13 · 40087 阅读 · 0 评论 -
编写一个http的调用链
这李借鉴我同事写的一个调用链,看看如果个一个请求加上一个调用链,这个其实在其它编程里面都会用到,如果熟悉拦截器的对此会应该会更有体会 先看看测试代码package mainimport ( "fmt" "net/http")func main() { http.ListenAndServe(":8080", regisry())}func Hell原创 2018-02-01 14:25:47 · 1559 阅读 · 0 评论 -
golang容器内DNS解析问题排查
先写一个一个测试案例package mainimport ( "fmt" "net" "os")func main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s hostname\n", os.Args[0]) fmt.Println("Usage:原创 2018-01-27 13:17:21 · 38999 阅读 · 0 评论 -
一致性hash的golang实现
对于一致性hash环的介绍本文就不在此赘述了,直接看怎样实现package hashringimport ( "crypto/md5" "fmt" "math" "sort")type HashKey uint32type HashKeyOrder []HashKeyfunc (h HashKeyOrder) Len() int ...原创 2018-03-26 13:13:29 · 1777 阅读 · 0 评论 -
gossip协议的原理和实战应用
先理解一下gossip协议:在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。每个节点可能知道所有其他节点,也可能仅知道几个邻居节点,只要这些节可以通过网络连通,最终他们的状态都是一致的,当然这也是疫情传播的特点。 简单的描述下这个协议,首先要传播谣言就要有种子节点。种子节点每秒都会随机向其他节点发送自己所拥有的节点列表,以及需要传播的消息...原创 2018-03-26 15:27:36 · 17655 阅读 · 1 评论 -
字符串连接性能测试
网上有些字符串连接的性能测试,先看一个错误的+连接func BenchmarkAddStringWithOperator(b *testing.B) { hello := "hello" world := "world" for i := 0; i < b.N; i++ { _ = hello + "," + world }}...原创 2018-03-22 10:23:31 · 768 阅读 · 0 评论 -
cobra 入门
任何一个知识点如果深入学习都是有很多值得深思的地方,kubectl是一个再简单不过的工具,但是它里面引用的一些第三方的包却有很值得考究,第一个是cobra。 举个例子 pkg/kubectl/cmd/exec.gofunc NewCmdExec(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command ...原创 2018-08-02 16:41:28 · 6445 阅读 · 0 评论 -
golang的slice你真的搞懂了吗
golang slice先看一个简单的代码块package mainimport ( "fmt")func main() { //case 1 a := []int{} a = append(a, 1) a = append(a, 2) b := append(a, 3) c := append(a, 4) fmt.Println("a: ", a, "\nb: ",..原创 2019-02-12 15:41:38 · 527 阅读 · 0 评论 -
go-restful实战与深入分析之源码篇
上一篇分析了go 原生的http服务。下面开始介绍go restful源码分析,有了上一篇的铺垫这篇文章讲解起来就很简单了。和go 的http一样启动监听: wsContainer := restful.NewContainer() server := &http.Server{Addr: ":8080", Handler: wsContainer}不用多说这个wsContainer原创 2017-04-23 13:37:30 · 38551 阅读 · 0 评论 -
go-restful实战与深入分析之基础篇
如果想分析清楚go-restful的工作原理我们这篇先介绍一些go http的基本知识,我将通过多个例子把故事串起来,先看一个最基本的helloworld的例子:func HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n")}func main() {原创 2017-04-23 12:15:16 · 40080 阅读 · 0 评论 -
go-restful实战与深入分析之使用篇
go的rest框架很多国内最著名应该是beego,但这个框架设计思想比较老套而且很笨重,如果需要一个轻量级的框架我个人挺喜欢go-restful先看看怎么使用,如果有过Flask或者springMVC的经验,这个很容易上手,所以我个人觉得语言是想通的,先学好一门语言其它的按照套路来就可以了,先看代码例子:package mainimport ( "log" "net/http"原创 2017-04-23 09:13:28 · 52155 阅读 · 1 评论 -
golang学习笔记之yaml文件处理
golang可以通过Unmarshal和Marshal函数处理json数据,当前如果你是yaml文件也可以解析,毕竟yaml和json只是不同的数据格式。先看例子:package mainimport ( "fmt" "log" "gopkg.in/yaml.v2")var data = `a: Easy!b: c: 2 d: [3, 4]`type T原创 2017-04-10 19:36:46 · 12158 阅读 · 0 评论 -
golang学习笔记之手写一个执行器
之前介绍过一个多协程的Parallelize,允许多个协程并发执行任务的函数,今天手写一个控制能力更强的的ruuner,初步实现单个协程处理,后续将继续改进为多协程处理:package runnerimport ( "errors" "os" "os/signal" "time" )type Runner struct { // interrupt channel reports原创 2017-04-11 10:02:17 · 682 阅读 · 0 评论 -
golang编写一个简单的生成消费模式
生成消费模式大家在现实生活中经常遇到,如果使用java编写可以使用阻塞队列如BlockingQueue,Python也有相应的组件,如果使用golang编写使用自带的channel管道更加简单。 下面直接看代码:package mainimport "fmt"func consumer(ch chan int,done chan string) { for i := range ch{原创 2017-04-03 08:22:36 · 37964 阅读 · 0 评论 -
golang 学习之grpc+ protobuf(一)
rpcrpc(远程过程调用)是现在微服务中服务之间调用的通用技术,整个Openstack里面组件内部的相互调用也是通过rpc+rabbitmq完成的,也有很多开源的rpc调用框架如dubbo、Zeroc Ice、thrift等。thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言;通过Zeroc Ice原创 2017-04-11 20:13:30 · 87889 阅读 · 1 评论 -
galang 学习之grpc+ protobuf(二)
上一篇介绍了grpc+ protobuf的一个helloworld,下面介绍一个多接口,并且具有验证功能等辅助一点的例子。这个例子主要是一个坐标使用获取的例子,先看看proto文件定义:yntax = "proto3";option java_multiple_files = true;option java_package = "io.grpc.examples.routeguide";opt原创 2017-04-12 15:09:44 · 77576 阅读 · 0 评论 -
golang学习笔记之range
range遍历是复制range遍历数组是复制数组: a := []int{1,2,3,4,5} for _,x := range a{ x += 3 } for _,x := range a{ fmt.Println(x) }输出结果是: 1 2 3 4 5 是复制了数组的元素,当然,如果你想修改数组的元素可以使用for原创 2017-04-04 10:35:56 · 9018 阅读 · 0 评论 -
golang学习笔记之赋值
变量作用域 a :=3 fmt.Println(&a,a) //a :=3 //变量重复定义的err { a :=2 fmt.Println(&a,a) }输出结果: 0xc42000a278 3 0xc42000a2a8 2 开辟新的内存空间保存变量,这涉及到变量的作用域赋值是先计算出右边的值 x, y :=1,原创 2017-04-04 10:59:04 · 8313 阅读 · 0 评论 -
golang学习笔记之引用类型与值类型
在golang中只有三种引用类型它们分别是切片slice、字典map、管道channel。其它的全部是值类型,引用类型可以简单的理解为指针类型,它们都是通过make完成初始化 看下面两个例子: a :=[5]int{2,3,4,5,6} b := a b[2]=77 fmt.Println(a, b)上面定义了一个数组a,它是值类型,复制给b是copy,当b发生变化后原创 2017-04-04 11:13:51 · 15307 阅读 · 3 评论 -
golang学习笔记之并发优化(一)
golang在并发上面还是很优雅的,有事细节大家可能不太了解。多处通知一次当wait阻塞等待done时,如果完成后,所有之前阻塞的wait都将收到通知,这样就可以通知多个协程。package mainimport ( "fmt" "sync" "time")func main() { var wg sync.WaitGroup wg.Add(1) go原创 2017-05-01 13:38:12 · 8929 阅读 · 0 评论 -
golang学习笔记之并发优化(二)
打包发送通往管道的数据如果一次打包发送的性能要高于多次发送。请看下面里面,这个里面我往管道里面发送50000000次func main() { done ,c :=make(chan int),make(chan int ,500) go func() { count :=0 for x := range c { count +原创 2017-05-01 17:15:50 · 6446 阅读 · 0 评论 -
golang 令牌桶限速器实现(ratelimit)
1000 毫秒(ms) = 1秒1,000,000 微秒(μs) = 1秒 1,000,000,000 纳秒(ns) = 1秒原创 2017-05-11 19:15:06 · 6833 阅读 · 1 评论 -
etcd v3命令和API
etcd v3版本和以前的v2在使用和操作上面还是有些区别的,首先是命令区别其次是使用上面。先看命令行使用,我尽量用命令,不需要太多的文字描述,最大的区别莫过于ls命令没有了。创建、更新keyetcdctl put /test/ok 11OKetcdctl put /test/ok 22OK删除keyetcdctl del /test/gg1查询keyetcdctl get /test/o原创 2017-05-12 15:08:20 · 47298 阅读 · 1 评论 -
go template基本使用
基本使用package mainimport ( "text/template" "os")type Friend struct { Fname string}type Person struct { UserName string Emails []string Friends []*Friend}func main() { f1原创 2017-04-22 16:04:59 · 38578 阅读 · 1 评论 -
golang 反射(一)
golang和java一样都支持反射,可以从变量反向推导出类型方法。float64反射先看一个基本类型float64的例子 var x float64 = 5.3 fmt.Println("type:", reflect.TypeOf(x)) v := reflect.ValueOf(x) fmt.Println("value:", v) fmt.Println原创 2017-04-07 10:49:55 · 10468 阅读 · 1 评论