
golang
Karl_zhujt
工作中积累的点点滴滴,分享给大家,如果有好的建议,请多多指教
展开
-
golang:访问mysql
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。package mainimport ( "database/sql" "log" _ "github.com/go-sql-driver/mysql")func main() { // db 是一个 sql.DB类型的对象 // 该对象线程安全,且内部已包含了一个连接池 // 连接池的选项可以在 sql.DB 的方法中设置 db,err:=sql.Open("mysql","root:123456@tcp(127.0.0.转载 2020-08-03 17:08:35 · 153 阅读 · 0 评论 -
golang:validate
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。下面是一个递归的深度优先搜索方式的遍历示例,采用反射对结构体进行树形遍历。package mainimport ( "fmt" "reflect" "regexp" "strconv" "strings")type Nested struct { Email string `validate:"email"`}type T struct { Age int `validate:"eq=10"` Nested Neste转载 2020-08-03 14:50:49 · 1658 阅读 · 0 评论 -
golang:REST接口
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。gRPC服务一般用于集群内部通信,如果需要对外暴露服务一般会提供等价的REST接口。通过REST接口比较方便前端JavaScript和后端交互。开源社区中的grpcgateway项目就实现了将gRPC服务转为REST服务的能力。grpc-gateway的工作原理如下图:通过在Protobuf文件中添加路由相关的元信息,通过自定义的代码插件生成路由相关的处理代码,最终将REST请求转给更后端的gRPC服务处理。1.环境准备google/a转载 2020-07-29 17:01:00 · 1070 阅读 · 0 评论 -
golang:github.com/mwitkow/go-proto-validators/validator.proto 文件在GoLand中不识别
练习《Go语言高级编程》中4.6.1验证器的案例时,代码如下:syntax = "proto3";package main;import "github.com/mwitkow/go-proto-validators/validator.proto";message Message { string important_string = 1 [(validator.field) = {regex: "^[a-z]{2,5}$"}]; int32 age = 2 [(validato原创 2020-07-27 23:20:53 · 2215 阅读 · 8 评论 -
golang:gRPC和Web服务共存
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。gRPC构建在HTTP/2协议之上,因此可以将gRPC服务和普通的Web服务架设在同⼀个端⼝之上。1.helloworld.protosyntax = "proto3";package main;service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}message HelloRequest { string name = 1;}messa转载 2020-07-08 12:59:30 · 1038 阅读 · 0 评论 -
golang:截取器
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。gRPC中的grpc.UnaryInterceptor和grpc.StreamInterceptor分别对普通⽅法和流⽅法提供了截取器的⽀持。不过gRPC框架中只能为每个服务设置⼀个截取器,因此所有的截取⼯作只能在⼀个函数中完成。开源的grpc-ecosystem项⽬中的go-grpc-middleware包已经基于gRPC对截取器实现了链式截取器的⽀持。这⾥简单介绍普通⽅法的截取器⽤法。1.helloworld.protosyntax =转载 2020-07-07 13:44:01 · 231 阅读 · 0 评论 -
golang:gRPC token认证
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。基于证书的认证是针对每个gRPC链接的认证。gRPC还为每个gRPC⽅法调⽤提供了认证⽀持,基于⽤户Token对不同的⽅法访问进⾏权限管理。1.helloworld.protosyntax = "proto3";package main;service Greeter{ rpc SayHello(HelloRequest) returns (HelloReply);}message HelloRequest{ string转载 2020-07-06 15:04:37 · 2245 阅读 · 0 评论 -
golang:gRPC 证书认证
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。gRPC建⽴在HTTP/2协议之上,对TLS提供了很好的⽀持。客户端在链接服务器中通过 grpc.WithInsecure() 选项跳过了对服务器证书的验证,没有启⽤证书的gRPC服务在和客户端进⾏的是明⽂通讯,信息⾯临被任何第三⽅监听的⻛险。为了保障gRPC通信不被第三⽅监听篡改或伪造,可以对服务器启动TLS加密特性。1.结构目录2.为服务器和客户端分别生成私钥和证书,存放在 tls-config/ 目录下,命令如下:// Makefi转载 2020-07-06 14:59:20 · 1408 阅读 · 0 评论 -
golang:RPC服务的简单登录验证
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。基于上下⽂可以针对不同客户端提供定制化的RPC服务,同时可以方便地为RPC服务增加简单的登陆状态的验证。1.server/main.gopackage mainimport ( "fmt" "log" "net" "net/rpc")type HelloService struct { conn net.Conn isLogin bool}func ServeHelloService(conn net.Conn)转载 2020-06-30 13:09:32 · 798 阅读 · 0 评论 -
golang:反向RPC
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。通常的RPC是基于C/S结构,RPC的服务端对应⽹络的服务器,RPC的客户端也对应⽹络客户端。但是对于⼀些特殊场景,⽐如在公司内⽹提供⼀个RPC服务,但是在外⽹⽆法链接到内⽹的服务器。这种时候我们可以参考类似反向代理的技术,⾸先从内⽹主动链接到外⽹的TCP服务器,然后基于TCP链接向外⽹提供RPC服务。1.Server/main.gopackage mainimport ( "net" "net/rpc" "time")type转载 2020-06-30 08:18:20 · 490 阅读 · 0 评论 -
golang:Protobuf代码生成插件
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。Protobuf的protoc编译器是通过插件机制实现对不同语⾔的⽀持。⽐如protoc命令出现 --xxx_out 格式的参数,那么protoc将⾸先查询是否有内置的xxx插件,如果没有内置的xxx插件那么将继续查询当前系统中是否存在protoc-gen-xxx命名的可执⾏程序,最终通过查询到的插件⽣成代码。对于Go语⾔的protoc-gen-go插件来说,⾥⾯⼜实现了⼀层静态插件系统。⽐如protoc-gen-go内置了⼀个gRPC插件,⽤户可以通过转载 2020-06-29 15:09:14 · 2117 阅读 · 0 评论 -
golang:Go语言对象到C++类
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。要实现Go语言对象到C++类的包装需要经过以下几个步骤:首先是将Go对象映射为一个id;然后基于id导出对应的C接口函数;最后是基于C接口函数包装为C++对象。构造一个Go对象// persion.gopackage maintype Person struct { name string age int}func NewPerson(name string, age int) *Person { return &Per转载 2020-05-27 08:43:48 · 973 阅读 · 0 评论 -
golang:C++类到Go语言对象
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。CGO是C语⾔和Go语⾔之间的桥梁,原则上⽆法直接⽀持C++的类。CGO不⽀持C++语法的根本原因是C++⾄今为⽌还没有⼀个⼆进制接⼝规范(ABI)。⼀个C++类的构造函数在编译为⽬标⽂件时如何⽣成链接符号名称、⽅法在不同平台甚⾄是C++的不同版本之间都是不⼀样的。但是C++是兼容C语⾔,所以我们可以通过增加⼀组C语⾔函数接⼝作为C++类和CGO之间的桥梁,这样就可以间接地实现C++和Go之间的互联。当然,因为CGO只⽀持C语⾔中值类型的数据类型,所以我们转载 2020-05-26 09:24:24 · 519 阅读 · 0 评论 -
golang:将C语言的qsort()函数封装成一个Golang语言的qsort()函数
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。qsort快速排序函数是C语⾔的⾼阶函数,⽀持⽤于⾃定义排序⽐较函数,可以对任意类型的数组进⾏排序。sort.go 支持包package c5/*#include <stdlib.h>typedef int (*qsort_cmp_func_t)(const void* a, const void* b);extern int _cgo_qsort_compare(void* a, void* b);*/import转载 2020-05-21 12:48:59 · 410 阅读 · 1 评论 -
golang:素数筛
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。package mainimport ( "context" "fmt")// 返回生成自然数序列的管道:2,3,4……func GenerateNatural(ctx context.Context) chan int { ch := make(chan int) go func() { for i := 2; ...转载 2020-05-06 23:03:41 · 333 阅读 · 0 评论 -
golang:发布订阅模型
《GO语言高级编程》设计中案例,仅作为笔记进行收藏。发布订阅(publish-and-subscribe)模型通常被简写为pub/sub模型。在这个模型中,消息⽣产者成为发布者(publisher),⽽消息消费者则成为订阅者(subscriber),⽣产者和消费者是M:N的关系。在传统⽣产者和消费者模型中,是将消息发送到⼀个队列中,⽽发布订阅模型则是将消息发布给⼀个主题。pubsub.go...转载 2020-05-04 20:47:15 · 1126 阅读 · 1 评论 -
golang:解析HTTP请求参数
《GO程序设计语言》设计中案例,仅作为笔记进行收藏。此案例将HTTP请求参数解析成对应的匿名结构体,并使用反射来获取字段标签。params 解析函数package paramsimport ( "fmt" "net/http" "reflect" "strconv" "strings")// Unpack 从 HTTP 请求 req 的参数中提取数据填充到 ptr 指向...转载 2020-04-15 13:38:40 · 5923 阅读 · 0 评论 -
golang:编码S表达式
《GO程序设计语言》设计中案例,仅作为笔记进行收藏。编码S表达式案例。Go语言的标准库支持了包括JSON、XML和ASN.1等多种编码格式。还有另一种依然被广泛使用的格式是S表达式格式,采用Lisp语言的语法。encode.go 编码,未带美化package sexprimport ( "bytes" "fmt" "reflect")func Marshal(v inter...转载 2020-04-14 13:58:19 · 713 阅读 · 0 评论 -
golang:采用反射的一个递归的值显示器
《GO程序设计语言》设计中案例,仅作为笔记进行收藏。反射案例。值显示器的代码package displayimport ( "fmt" "reflect" "strconv")func Display(name string, x interface{}) { fmt.Printf("Display %s (%T):\n", name, x) display(name,...转载 2020-04-14 11:17:31 · 413 阅读 · 0 评论 -
golang:并发非阻塞缓存_通信顺序进程
《GO程序设计语言》设计中案例,仅作为笔记进行收藏。并发非阻塞的缓存系统案例,它能解决函数记忆问题,即缓存函数的结果,大道多次调用但只须计算一次的效果。此案例通信顺序进程构建。package memotestimport ( "fmt" "io/ioutil" "log" "net/http" "sync" "testing" "time")func httpGetB...转载 2020-04-06 22:35:42 · 243 阅读 · 0 评论 -
golang:并发非阻塞缓存_共享变量上锁
《GO程序设计语言》设计中案例,仅作为笔记进行收藏。并发非阻塞的缓存系统案例,它能解决函数记忆问题,即缓存函数的结果,大道多次调用但只须计算一次的效果。此案例采用共享变量上锁构建。package memotestimport ( "fmt" "io/ioutil" "log" "net/http" "sync" "testing" "time")func httpGe...转载 2020-04-06 22:32:00 · 382 阅读 · 0 评论 -
golang:聊天服务器
《GO程序设计语言》设计中案例,仅作为笔记进行收藏。简单的聊天服务器,使用telnet 发送信息。package mainimport ( "bufio" "fmt" "log" "net")func main() { listener, err := net.Listen("tcp", "localhost:8000") if err != nil { log.F...转载 2020-04-03 21:53:45 · 308 阅读 · 0 评论 -
golang:并发目录遍历
《GO程序设计语言》设计中案例,仅作为笔记进行收藏。并发遍历目录实现了统计文件个数及文件总大小。package mainimport ( "flag" "fmt" "os" "path/filepath" "sync" "time")var vFlag = flag.Bool("v", false, "show verbose progress messages")...转载 2020-04-03 13:13:13 · 1671 阅读 · 0 评论 -
golang:并发的 Web 爬虫
《GO程序设计语言》设计中案例,仅作为笔记进行收藏。Web 爬虫 只是简单获取页面属性href中链接。package mainimport ( "fmt" "log" "net/http" "os" "golang.org/x/net/html")func main() { // 可能有重复的 URL 列表 worklist := make(chan []strin...转载 2020-03-27 10:55:59 · 363 阅读 · 0 评论