一个自己实现的Excel as relate db读取库go-excel

yhf_szb 发表了文章 • 0 个评论 • 152 次浏览 • 4 天前 • 来自相关话题

在复杂的系统中(例如游戏),有时候为了便于非专业人员(策划)设置一些配置,会使用Excel作为一种轻量级的关系数据库或者配置文件,毕竟对于很多非开发人员来说,配个Excel要比写json或者yaml什么简单得多。

而且Excel可以写入各种... 查看全部

在复杂的系统中(例如游戏),有时候为了便于非专业人员(策划)设置一些配置,会使用Excel作为一种轻量级的关系数据库或者配置文件,毕竟对于很多非开发人员来说,配个Excel要比写json或者yaml什么简单得多。


而且Excel可以写入各种格式和字体标红单元格,维护成本大大降低。


这种场景下,读取特定格式(符合关系数据库特点的表格)的数据会比各种花式写入Excel的功能更重要,毕竟从编辑上来说微软提供的Excel本身功能就非常强大了,而现在我找到的Excel库的功能都过于强大了,用起来有点浪费,于是写了这个简化库。


这个库的工作参考了tealeg/xlsx的部分实现和读取逻辑。


假设有一个xlsx文件,里边有个Sheet叫“Standard”,它的数据结构如下:










































ID NameOf Age Slice UnmarshalString
1 Andy 1 1|2 {"Foo":"Andy"}
2 Leo 2 2|3|4 {"Foo":"Leo"}
3 Ben 3 3|4|5|6 {"Foo":"Ben"}
4 Ming 4 1 {"Foo":"Ming"}


  • 第0行是标题行。

  • 第1行开始是数据行。


以下是最简单的写法


// defined a struct
type Standard struct {
// use field name as default column name
ID int
// column means to map the column name
Name string `xlsx:"column(NameOf)"`
// you can map a column into more than one field
NamePtr *string `xlsx:"column(NameOf)"`
// omit `column` if only want to map to column name, it's equal to `column(AgeOf)`
Age int `xlsx:"AgeOf"`
// split means to split the string into slice by the `|`
Slice []int `xlsx:"split(|)"`
// *Temp implement the `encoding.BinaryUnmarshaler`
Temp *Temp `xlsx:"column(UnmarshalString)"`
// use '-' to ignore.
Ignored string `xlsx:"-"`
}

// func (this Standard) GetXLSXSheetName() string {
// return "Some other sheet name if need"
// }

type Temp struct {
Foo string
}

// self define a unmarshal interface to unmarshal string.
func (this *Temp) UnmarshalBinary(d []byte) error {
return json.Unmarshal(d, this)
}

func main() {
// will assume the sheet name as "Standard" from the struct name.
var stdList []Standard
err := excel.UnmarshalXLSX("./testdata/simple.xlsx", &stdList)
if err != nil {
panic(err)
}
}

提供一些更复杂的读取逻辑,详细看文档:https://github.com/szyhf/go-excel


时间关系,可能看test目录里的代码更好理解……



欢迎捉虫提bug。


图片验证码代码分享

jajijo 回复了问题 • 6 人关注 • 4 个回复 • 871 次浏览 • 2017-09-15 17:55 • 来自相关话题

golang版本的curl请求库

mikemintang 发表了文章 • 0 个评论 • 255 次浏览 • 2017-09-15 07:55 • 来自相关话题

Github地址


https://github.com/mikemintang/go-curl


安装


go get github.com/mikemintang/go-curl

使用


package main

import (
"fmt"
"github.com/mikemintang/go-curl"
)

func main() {

url := "http://php.dev/api.php"

headers := map[string]string{
"User-Agent": "Sublime",
"Authorization": "Bearer access_token",
"Content-Type": "application/json",
}

cookies := map[string]string{
"userId": "12",
"loginTime": "15045682199",
}

queries := map[string]string{
"page": "2",
"act": "update",
}

postData := map[string]interface{}{
"name": "mike",
"age": 24,
"interests": []string{"basketball", "reading", "coding"},
"isAdmin": true,
}

// 链式操作
req := curl.NewRequest()
resp, err := req.
SetUrl(url).
SetHeaders(headers).
SetCookies(cookies).
SetQueries(queries).
SetPostData(postData).
Post()

if err != nil {
fmt.Println(err)
} else {
if resp.IsOk() {
fmt.Println(resp.Body)
} else {
fmt.Println(resp.Raw)
}
}

}

接收请求的api.php


<?php  

//echo json_encode($_GET); // 获取url地址中的查询参数
//echo json_encode(getallheaders()); // 获取请求头
//echo json_encode($_COOKIE); // 获取cookies
echo file_get_contents("php://input"); // 获取post提交的数据

function getallheaders() {
$headers = [];
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}

可导出的成员变量和方法



TodoList



  • [x] 以链式操作的方式发起请求

  • [ ] 以函数回调的方式发起请求

  • [ ] 以类Jquery Ajax的方式发起请求

  • [x] 发起GET/POST请求

  • [ ] 发起PUT/PATCH/DELETE/OPTIONS操作

  • [x] 以application/x-www-form-urlencoded形式提交post数据

  • [x] 以application/json形式提交post数据

  • [ ] 以multipart/form-data形式提交post数据

  • [ ] proxy代理设置

grpc-gateway的替代品--Turbo

zzxx513 发表了文章 • 0 个评论 • 200 次浏览 • 2017-09-15 01:06 • 来自相关话题

转载自:https://zhuanlan.zhihu.com/p/29350695

grpc-gateway是一个使用起来很便捷的工具,... 查看全部

转载自:https://zhuanlan.zhihu.com/p/29350695


grpc-gateway是一个使用起来很便捷的工具,可以很方便的把grpc接口用HTTP的方式暴露出去。


但在实际使用过程中,也在grpc-gateway里发现了一些问题,比如:


1,灵活性不够,如果有一些比较特殊的需求,在grpc-gateway中能扩展的余地不大;


2,严重依赖protocol buffer,而且必须是protobuf 3;


3,即使grpc服务的接口不变,只是修改HTTP接口定义,也必须重新生成代码,也就必须重新部署,重启服务;


4,只支持JSON格式的输入,不支持传统的kv格式的参数;


5,只支持grpc,嗯。。好吧,这不算问题,但thrift也很普及,是不是?


6,grpc-gateway在错误处理等方面都不够成熟,而且开发者似乎也不是很活跃。。。


Turbo努力解决了上面提到的问题,这是项目的地址:


vaporz/turbo


这是文档地址,很贴心很详细,中英双语哦~


Turbo Documentation


除了提供基本的与grpc-gateway类似的HTTP代理功能,Turbo还可以做到:


1,高度灵活,提供各种基于切面(不是吃的那个“切面”)思想的组件,可以在各个环节进行定制;


2,只依赖grpc,对protocol buffer没有要求,因此,你既可以使用protobuf2,也可以使用protobuf3;


3,HTTP接口的定义,以及与后端接口之间的映射,可以在运行时直接修改,并且立即生效!


4,不仅支持JSON格式的输入,也支持传统的kv格式的输入!


5,不仅支持grpc,还支持thrift!


6,自带命令行工具,一键创建可运行的项目,一键重新生成代码!


Turbo目前仍处于诞生初期,但现在的代码已经经过了认真的测试,认真细致的测试用例让测试覆盖率达到了98%。


当然,测试覆盖率说明不了多少问题,只有经过实战考验的代码才是可靠的!


因此,欢迎大家多多试用,多多吐槽,有任何建议或想法,请在GitHub上开Issue,坐等。


遇到任何问题,我愿意尽力帮助,尽力解决!


谢谢!

使用反射对绑定url参数到结构体

tanghui 发表了文章 • 1 个评论 • 143 次浏览 • 2017-09-14 00:00 • 来自相关话题

通过反射自动绑定url参数到结构体,同时支持对参数范围进行校验已经参数默认值的设置 example:

 package ma... 			查看全部
					

通过反射自动绑定url参数到结构体,同时支持对参数范围进行校验已经参数默认值的设置
example:


 package main
import (
"net/http"
"fmt"

"github.com/lintanghui/parse"
)
func main(){
type v struct {
Data16 int8 `params:"aaa;Range(1,10)" default:"10"`
Data32 int32
Data64 int64 `params:"data64;Range(1,20)" default:"20"`
Float32 float32 `params:"ccc"`
String string `params:"sss" default:"-"`
SliceInt []int64 `params:"iii"`
SliceStr []string `params:"ttt"`
Bool bool `params:"bbb"`
}
req, err := http.NewRequest("GET", "http://www.linth.top/x?aaa=11&data64=33&Data32=32&string=aaa&iii=1,2,3&ttt=a,b,c&bbb=true&ccc=1.2", nil)
req.ParseForm()
if err != nil {
t.Log(err)
}
p := parse.New()
var data = &v{}
err = p.Bind(data, req.Form)
fmt.Printf("%+v",data)
// OUTPUT:
// &{Data16:10 Data32:32 Data64:20 Float32:1.2 String: SliceInt:[1 2 3] SliceStr:[a b c] Bool:true}
}

https://github.com/lintanghui/parse

[开源]golang123 是使用 vue、nuxt、node.js 和 golang 开发的社区系统

shen100 发表了文章 • 5 个评论 • 357 次浏览 • 2017-09-13 17:42 • 来自相关话题

golang123 是一个开源的社区系统,界面优雅,功能丰富,小巧迅速。 已在golang中文社区 得到应用,你完全可以用它来搭建自己的社区。

golang... 查看全部

golang123 是一个开源的社区系统,界面优雅,功能丰富,小巧迅速。
已在golang中文社区 得到应用,你完全可以用它来搭建自己的社区。


golang123的技术架构是前后端分离的, 前端使用vueiviewnode.jsnuxt等技术来开发, 后端使用gogormiris等技术来开发。golang123的技术选型也是超前的, 我们大胆得使用nuxt来做前后端同构渲染



golang123目前正处于活跃的开发中,预计十月初发布Beta版



社区首页



Golang123线上机器配置



















CPU 1核
内存 512 MB
带宽 1Mbps

安装


依赖的软件



























软件 版本
node.js 8.4.0 (及以上)
golang 1.9 (及以上)
mysql 5.6.35 (及以上)
redis 4.0.1 (及以上)

克隆代码


golang123的代码克隆到gopath的src目录下,即your/gopath/src/golang123


前端依赖的模块


进入golang123/website目录,输入命令


npm install

如果安装失败,或速度慢,可尝试阿里的镜像


npm install --registry=https://registry.npm.taobao.org

后端依赖的库


//iris web框架
go get -u github.com/kataras/iris

//gorm 持久层框架
go get -u github.com/jinzhu/gorm

//redis客户端工具
go get github.com/garyburd/redigo/redis

//uuid生成工具
go get github.com/satori/go.uuid

//防XSS攻击
go get -u github.com/microcosm-cc/bluemonday

//markdown解析器
go get github.com/russross/blackfriday

配置


hosts


127.0.0.1 dev.golang123.com


nginx



  1. golang123/nginx/dev.golang123.com.example.conf文件改名为dev.golang123.com.conf,然后拷贝到nginx的虚拟主机目录下

  2. golang123/nginx/server.keygolang123/nginx/server.crt拷贝到某个目录下

  3. 打开nginx的虚拟主机目录下的dev.golang123.com.conf文件,然后修改访问日志和错误日志的路径,即修改access_log和error_log。

  4. 修改证书路径为server.key和server.crt所在的路径,即修改ssl_certificate和ssl_certificate_key


请参考如下配置中请修改标记的地方:


server {
listen 80;
server_name dev.golang123.com;

access_log /path/logs/golang123.access.log; #请修改
error_log /path/logs/golang123.error.log; #请修改

rewrite ^(.*) https://$server_name$1 permanent;
}

server {
listen 443;
server_name dev.golang123.com;

access_log /path/logs/golang123.access.log; #请修改
error_log /path/logs/golang123.error.log; #请修改

ssl on;
ssl_certificate /path/cert/golang123/server.crt; #请修改
ssl_certificate_key /path/cert/golang123/server.key; #请修改

...

}

前端配置


golang123/website/config/index.example.js文件重命名为index.js


后端配置


golang123/config.example.json文件重命名为config.json,然后修改以下配置:



  1. 修改mysql连接地址及端口

  2. 修改mysql的用户名及密码

  3. 修改redis的连接地址及端口

  4. 修改域名邮箱的用户名及密码(golang123使用的是QQ域名邮箱)


运行


运行前端项目


进入golang123/website目录,然后运行


npm run dev

运行后端项目


进入golang123目录,然后运行


go run main.go

访问


浏览器中访问 https://dev.golang123.com/


问题


有任何问题或建议都欢迎提 issue


技术交流


QQ群: 32550512

QQ群中的消息很可能还没被看到,就被后来的消息给冲掉,有问题还是建议大家开issue


赞助


如果你觉得golang123这个项目还不错的话,可以通过扫描下面的二维码来赞助我, 金额任意,无上限 ^v^



License


GPL

Copyright (c) 2013-present, shen100

x86/x64 汇编语言练习工具

sheepbao 回复了问题 • 7 人关注 • 6 个回复 • 354 次浏览 • 2017-09-11 15:05 • 来自相关话题

RobotGo v0.46.0 发布, 修复重要 bug

够浪 回复了问题 • 3 人关注 • 3 个回复 • 408 次浏览 • 2017-09-03 23:53 • 来自相关话题

filebeat 在源码上区分Windows 和Linux系统吗

回复

KSpeer 回复了问题 • 1 人关注 • 1 个回复 • 278 次浏览 • 2017-09-01 14:43 • 来自相关话题

高性能的 encoding/json 替代品 jsoniter 发布 1.0.0

taowen 发表了文章 • 6 个评论 • 286 次浏览 • 2017-08-31 00:08 • 来自相关话题

https://github.com/json-iterator/go 完全实现 encoding/json 的所有行为,但是速度要快很多。同时通过ext... 查看全部

https://github.com/json-iterator/go 完全实现 encoding/json 的所有行为,但是速度要快很多。同时通过extension机制提供了更强大的扩展能力。发布至今已经突破了 1000 star。在 Kubernetes 团队成员的催促下(https://github.com/json-iterator/go/issues/154 ),今天发布了 1.0.0 版本,希望能够被合并到 Kubernetes 的代码里。


jsoniter 诞生于滴滴出行平台技术部的实际业务需求之中。如果你也想加入我们,做有挑战的 Go 应用开发,请加我的微信:nctaowen。

Go 语言在命令行以表格的形式输出结构体切片

modood 发表了文章 • 3 个评论 • 239 次浏览 • 2017-08-29 15:32 • 来自相关话题

最近写的小工具,可以在命令行以表格的形式输出结构体切片

  • 没有第三方依赖
  • 支持中文汉字
  • 表格每列自动对齐
  • 支持自动适应列宽
  • 结构体的字段支持所有数据类型(字符... 查看全部

最近写的小工具,可以在命令行以表格的形式输出结构体切片



  • 没有第三方依赖

  • 支持中文汉字

  • 表格每列自动对齐

  • 支持自动适应列宽

  • 结构体的字段支持所有数据类型(字符串,切片,映射等)


例如可以很方便清晰地将数据库查询结果列表(结构体切片)在命令行以表格的形式输出。


项目 Github 主页:https://github.com/modood/table


对你有用的话,给个 star 支持一下吧~


package main

import (
"fmt"

"github.com/modood/table"
)

type House struct {
Name string
Sigil string
Motto string
}

func main() {
s := []House{
{"Stark", "direwolf", "Winter is coming"},
{"Targaryen", "dragon", "Fire and Blood"},
{"Lannister", "lion", "Hear Me Roar"},
}

table.Output(s)
}

输出结果:


┌───────────┬──────────┬──────────────────┐
│ Name │ Sigil │ Motto │
├───────────┼──────────┼──────────────────┤
│ Stark │ direwolf │ Winter is coming │
│ Targaryen │ dragon │ Fire and Blood │
│ Lannister │ lion │ Hear Me Roar │
└───────────┴──────────┴──────────────────┘

beats 组件的开发

duanquanyong 回复了问题 • 2 人关注 • 1 个回复 • 327 次浏览 • 2017-08-28 12:50 • 来自相关话题

Golang API 业务监控项目求大神指点

haoweishow 回复了问题 • 3 人关注 • 2 个回复 • 854 次浏览 • 2017-08-22 09:20 • 来自相关话题

请问有没有比较好的分布式系统监控项目?

fiisio 回复了问题 • 10 人关注 • 4 个回复 • 1019 次浏览 • 2017-08-21 10:41 • 来自相关话题

Go 语言编写轻量级网络库,GrapeNet

koangel 发表了文章 • 0 个评论 • 410 次浏览 • 2017-08-20 11:36 • 来自相关话题

简介(Introduction)

Go语言编写轻量级网络库 (grapeNet is a lightweight and Easy Use Network Framework)

可用于游戏服务端、强网络服务器端或其他类似应... 查看全部

简介(Introduction)


Go语言编写轻量级网络库 (grapeNet is a lightweight and Easy Use Network Framework)


可用于游戏服务端、强网络服务器端或其他类似应用场景,每个模块单独提取并且拥有独立的使用方法,内部耦合性较轻。


其实GO语言曾经有过很多强架构的框架,比如GOWOLRD之类的,已经足够了,但是我会将库用于各种轻量级应用不需要过于复杂的内容,所以我设计了GrapeNet,目的是模块独立化。 你可以拆开只使用其中很小的模块,也可以组合成一个服务端,并且在架构中设计也较为轻松,至于热更新的问题,目前脚本数据支持热更新,并且是自动的,只要跑一下UPDATE即可,程序本身稍后测试后发布(仅支持LINUX)。


本库更像是一个日常服务端开发的轻量级工具库集合,用的开心噢。


慢慢更新中,很多坑要填,目前暂不适合用于商业项目。


个人博客:http://grapec.me/



安装


go get -u github.com/koangel/grapeNet...


模块表(Function)



  • Lua脚本绑定管理(可绑定任何类型的函数、线程安全且自动推倒类型)

  • 日志库(底层采用Seelog)

  • 函数管理系统(可以根据任何类型参数将其与函数绑定并互相调用)

  • 流处理

  • Tcp网络

  • Websocket网络 (基础版)

  • Codec(任意类型注册对象并在其他位置动态创建该对象)

  • CSV序列化模块(通过Tag可以直接序列化到对象或对象序列化为CSV)


依赖第三方



  • Seelog (github.com/cihub/seelog)

  • Gopher-lua(github.com/yuin/gopher-lua)

  • Gopher-luar(layeh.com/gopher-luar)


不依赖任何CGO内容,lua本身也是纯GO实现。