在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制

身份认证和授权对 web 应用的安全至关重要。最近,我用 Go 完成了我的第一个正式的 web 应用,这篇文章是在这个过程中我所学到的部分内容。 本文中,我们的关注点在于如何在 web 应用中使用开源的 casbin 库进行 HTTP 权限控制。同时,在示例代码中我们使用了 scs 库进行 session 管理。 下面的例子十分基础,希望它尽可能的展示了如何在 Go web 应用中实现权限控制。为了更侧重于展示 casbin 的使用,我们尽量简化业务逻辑(例如:不需密码的登陆操作)。...阅读全文

阅读:27513 评论:3

Go 函数式选项模式

本文译自 Functional Options Pattern in Go 版权@归原文所有. Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的配置. 在很多语言中这很容易; 在 C 族语言中, 可以使用不同数量的参数提供相同函数的多个版本; 在像 PHP 这样的语言中, 可以给参数一个默认值,并在调用方法时忽略它们. 但是在 Golang 中, 这两种方式你哪个...阅读全文

阅读:4411 评论:0

让我们用 Go 语言创建一个 NTP 客户端

在网络编程做了一些研究之后,我邂逅了一篇题目为《Let's Make a NTP Client in C》,由 David Lettier(Lettier) 编写的文章。这篇文章鼓舞了我用 Go 去做相似的事。 > 这篇博文提到的代码都在这里 [https://github.com/vladimirvivien/go-ntp-client](https://github.com/vladimirvivien/go-ntp-client)。 这篇博文描述了一个(真正的) NTP 客户端...阅读全文

2018-02-03 11:21:13 gogeof
阅读:3641 评论:0

golang restful 框架之 go-swagger

restful 是这些年的高频词汇了,各大互联网公司也都纷纷推出了自己的 restful api,其实 restful 和 thrift,grpc 类似,就是一种协议,但是这种协议有点特殊的就是使用 http 接口,返回的对象一般是 json 格式,这样有个好处,就是可以供前端的 js 直接调用,使用非常方便,但 http 本身并不是一个高效的协议,后端的内部通信还是使用 grpc 或者 thrift 可以获得更高的性能 其实如果只是要用 http 返回 json 本身并不是一件很难的事情,不用...阅读全文

2018-02-09 03:34:36 hatlonely
阅读:2185 评论:0

Grpc+Grpc Gateway实践一 介绍与环境安装

介绍与环境安装 假定我们有一个项目需求,希望用Rpc作为内部API的通讯,同时也想对外提供Restful Api,写两套又太繁琐不符合 于是我们想到了Grpc以及Grpc Gateway,这就是我们所需要的 准备环节 在正式开始我们的Grpc+Grpc Gateway实践前,我们需要先配置好我们的开发环境 Grpc Protoc Plugin Protocol Buffers Grpc-gateway Grpc 是什么 Google对Grpc的定义: A high performance, op...阅读全文

2018-02-23 17:34:38 EDDYCJY
阅读:3710 评论:0

如何优雅的关闭Go Channel【译】

*Channel关闭原则* 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作。 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费者已经没有值可以继续读了。只要坚持这个原则,就可以确保向一个已经关闭的channel发送数据的情况不可能发生。 *暴力关闭channel的正确方法* 如果想要在消费端关闭channel,或者在多个生产者端关闭channel,可以使用recover机制来上个保险,避免程序因为panic而崩...阅读全文

阅读:1390 评论:1

使用二进制形式发布go package

我们在使用Go进行开发的时候, 经常会使用到第三方的库, 这时候我们一般都会通过go get到github.com、bitbucket或者自己私有库中去拉取第三库的源代码。 今天正好群里有网友问能不能将自己开发的库以二进制形式提供给用户,我就顺便整理了一下。 以二进制方式提供库的动机可能是为了保护自己公司的知识产权,也有可能是从安全的角度考虑,避免一些关键信息的泄漏等等,这不是本文讨论的范围。 虽然以前的版本能够曲折的实现使用二进制的库,但是正式提供的方案是在Go 1.7中。 在 Go 1.7 ...阅读全文

阅读:948 评论:0

gf框架之gvalid – 强大灵活的数据校验/表单校验模块

gf提供了非常强大易用的数据校验功能,通过gvalid包提供,封装了40种常用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验等特性。由于gf是模块化、低耦合设计,gvalid包也可以在项目中单独引入使用。 使用方式: import "gitee.com/johng/gf/g/util/gvalid" 校验规则 40种常用的校验规则: required 格式:required 说明:必需参数 required-if 格式:required-if:field,...阅读全文

阅读:1792 评论:0

6行代码解决golang TCP粘包

什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论。本文使用golang的bufio.Scanner来实现自定义协议解包。 协议数据包定义 本文模拟一个日志服务器,该服务器接收客户端传到的数据包并显示出来 type Package struct { Version [2]byte // 协议版本,暂定V1 Length int16 // 数据部分长度 Timestamp int64 // 时间戳 HostnameLength int16 // 主机名长度 Hostname []byte...阅读全文

2018-03-02 18:34:40 xialeistudio
阅读:2522 评论:1

Grpc+Grpc Gateway实践三 Swagger了解一下

Swagger了解一下 在上一节,我们完成了一个服务端同时支持Rpc和RESTful Api后,你以为自己大功告成了,结果突然发现要写Api文档和前端同事对接= = 。。。 你寻思有没有什么组件能够自动化生成Api文档来解决这个问题,就在这时你发现了Swagger,一起了解一下吧! 介绍 Swagger Swagger是全球最大的OpenAPI规范(OAS)API开发工具框架,支持从设计和文档到测试和部署的整个API生命周期的开发 Swagger是目前最受欢迎的RESTful Api文档生成工具...阅读全文

2018-03-04 21:34:39 EDDYCJY
阅读:2373 评论:0

Goroutine+Channel+WaitGroup使用

介绍 goroutine golang语言中最有特色之一的东东就是这个goroutine了,很多时候问起别人为什么golang的好用,golang的网络性能可以那么好,一般都会多多少少想到goroutine,提起goroutine。在linux中内核的调度最小单位是就是thread,同一个进程中的多个thread线程就对应内核中的多个thread实体。所以thread是内核级的,而gorountine是一个不同于thread的概念,gorountine是一个用户态,另外一种说法也就携程,是用户态...阅读全文

阅读:4948 评论:0

golang Reflect包

Reflect包 Reflect 反射包有2个重要的类型,分别通过Typeof()和ValueOf()返回。 分别在源码包里的reflect包中的type.go和value.go Type TypeOf() 返回一个Type接口类型,源码中 type Type interface { Align() int FieldAlign() int Method(int) Method MethodByName(string) (Method, bool) NumMethod() int Name() ...阅读全文

阅读:2241 评论:0

goroutine 和 channel 不可滥用

我以前觉得使用 goroutine 和 channel 的性能开销是基本忽略不计的--尤其是和 IO 的性能开销相比--但是最近我做了一个实验,实际验证了下。 我在给[我的课程项目](https://bradfieldcs.com/courses/databases/)做一个[玩具相关的数据库](https://github.com/robot-dreams/zdb2)。一开始,我从 CSV 文件里加载数据表,后来我需要添加一个二进制的表格结构。不幸的是,第一次尝试(加载二进制表格)的效果...阅读全文

2018-03-09 11:13:18 ArisAries
阅读:4123 评论:0

使用 Golang 构建整洁架构

## 什么是整洁架构? 在《Clean Architecture: A Craftsman’s Guide to Software Structure and Design》一书中,著名作家 Robert “Uncle Bob” Martin 提出了一种具有一些重要特性的体系结构,如框架、数据库和接口的可测试性和独立性。 整洁架构的约束条件是: * 独立的框架。该体系结构并不依赖于某些带有特性的软件库的存在。这允许您使用这些框架作为工具,而不是将您的系统束缚在有限的约束中。 ...阅读全文

2018-03-09 11:28:42 polaris
阅读:5349 评论:0

你的 pprof 暴露了

IPv4 扫描暴露出的 `net/http/pprof` 端点(endpoint) 原文发表日期: 2017/9/27 Go语言的 [net/http/pprof](https://golang.org/pkg/net/http/pprof/) 包是令人难以置信的强大的,调试正在运行的生产服务器的这个功能微不足道,而在这个调试过程,就很容易不经意间将调试信息暴露给世界。在这篇文章中,我们用 [zmap project](https://github.com/zmap) 作为例子,展示...阅读全文

2018-03-13 14:42:17 lightfish-zhang
阅读:4659 评论:0

Go 语言神奇的 JSON

今天我想和大家分享 Go 语言一些非常实用的技巧,用于编码和解码 JSON 文档。Go 语言的  `encoding/json` 包有一些有趣的特性,帮助我们轻松地解析 JSON 文档。你可以轻松地将大多数实际应用中的 JSON 转换为带有 Go 语言结构体标签的接口或者是 `Marshaler` 和 `Unmarshaler` 接口。 但有一个案例比较棘手:包含转义 JSON 元素的 JSON 文档。如下所示: ```json { "id": 12345, "name":...阅读全文

2018-03-19 10:27:46 SergeyChang
阅读:2936 评论:0

go语言学习总结

由于工作原因本人接触了一个月的go语言,使用过程中碰到很多问题也学习到很多知识下面对用到的知识以及注意事项做个总结,希望对刚接触go语言的同学有一些帮助 一、数据类型转换 package main import ( "fmt" "strconv" ) func main() { //int到string str := strconv.Itoa(int(1)) fmt.Println("int转string", str) //int64到string str2 := strconv.FormatI...阅读全文

2017年08月30日 16:55:29 qq_33549434
阅读:690 评论:0

protobuf与protoc-gen-go

## 什么是protobuf Protobuf(Protocol Buffer)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多...阅读全文

2018-03-25 00:30:32 chalvern
阅读:25906 评论:0

剖析与优化 Go 的 web 应用

Go 语言有一个很强大的内置分析器(profiler),支持CPU、内存、协程 与 阻塞/抢占(block/contention)的分析。 ## 开启分析器(profiler) Go 提供了一个低级的分析 API [runtime/pprof](https://golang.org/pkg/runtime/pprof/) ,但如果你在开发一个长期运行的服务,使用更高级的 [net/http/pprof](https://golang.org/pkg/net/http/pprof/) ...阅读全文

2018-03-25 22:32:08 lightfish-zhang
阅读:2588 评论:1